Skip to content

Subclass method parameter names are not checked against superclass #6709

@benclifford

Description

@benclifford
  • Are you reporting a bug, or opening a feature request?

Bug

  • Please insert below the code you are checking with mypy,
    or a mock-up repro if the source is private. We would appreciate
    if you try to simplify your case to a minimal repro.

When a subclass renames the parameters of a method, this results in runtime errors; but this seems like something that should be statically detectable.

The below code provides a superclass A, and two similar subclasses B and C that differ in that C renames the parameter to the method f, but B does not.

mypy vs runtime behaviour for variables c and c2 seems inconsistent, while for c3 and c4 it seems ok.

I was expecting some mypy error to be raised when defining f in class C.

class A:
    def f(self, x: int) -> None:
      print("A: ", x)

class B(A):
    def f(self, x: int) -> None:
      print("B: ", x)

class C(A):
    def f(self, n: int) -> None:
      print("C: ", n)

a = A()
a.f(x=3)

b = B()  # type: A
b.f(x=3)

c = C()  # type: A
c.f(x=3)  # mypy passes, but gives runtime error: TypeError: f() got an unexpected keyword argument 'x'

c2 = C()  # type: A
c2.f(n=3) # mypy gives an error:  error: Unexpected keyword argument "n" for "f" of "A"   but runtime works.

c3 = C()  # type: C
c3.f(x=3)    # mypy give type error: error: Unexpected keyword argument "x" for "f" of "C", and runtime error: mypy-issue.py:25: error: Unexpected keyword argument "x" for "f" of "C"

c4 = C()  # type: C
c4.f(n=3)  # no errors in mypy or at runtime
  • What are the versions of mypy and Python you are using?

$ mypy --version
mypy 0.670
$ python --version
Python 3.7.2+

  • Do you see the same issue after installing mypy from Git master?

yes - mypy 0.710+dev.f10528a5a8d9e98939ceb84d40e614d1f159d9a0

  • What are the mypy flags you are using? (For example --strict-optional)

With no flags, and with --strict.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions