Subclass method parameter names are not checked against superclass
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 20.6k
- Forks
- 3.3k
- PR merge metrics
- PR metrics pending
Description
- 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.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the minimal subclass example in the issue and run it against mypy with and without --strict to reproduce the inconsistent keyword-argument checks. Trace the override and method-signature handling used for class C; done means mypy reports the incompatible parameter rename when defining the subclass while preserving valid calls for compatible overrides.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100