functools.partialmethod not supported properly?
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.
import operator
from functools import partialmethod
class IntCmp:
def __init__(self, value):
self._value = value
def _cmp(self, opr, other: int) -> bool:
if isinstance(other, int):
return opr(self._value, other)
return NotImplemented
__eq__ = partialmethod(_cmp, operator.eq) # Incompatible types in assignment (expression has type "partialmethod[bool]", base class "object" defined the type as "Callable[[object, object], bool]")
__ne__ = partialmethod(_cmp, operator.ne) # Incompatible types in assignment (expression has type "partialmethod[bool]", base class "object" defined the type as "Callable[[object, object], bool]")
# rest of the comparison operators (lt, le, gt, ge) type checks correctly
c = IntCmp(1)
assert c == 1 # Cannot determine type of '__eq__'
- What is the actual behavior/output?
MyPy reports an error on the comparison, saying Cannot determine type of '__eq__', as well as incompatible types on assignment as shown.
The code correctly passes at runtime.
- What is the behavior/output you expect?
__eq__ and __ne__ should correctly type-check the partialmethod, and comparison should give no error. This particular partialmethod usage is shown in Python docs: https://docs.python.org/3/library/functools.html#functools.partialmethod
- What are the versions of mypy and Python you are using?
Do you see the same issue after installing mypy from Git master?
Using latest git master, Python 3.8.1
- What are the mypy flags you are using? (For example --strict-optional)
--follow-imports=silent
--show-column-numbers
--ignore-missing-imports
--check-untyped-defs
EDIT: I am aware of #2967 and #1484 being a thing, however this covers partialmethod usage which wasn't mentioned as a topic in the two other issues.
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 by running mypy on the supplied Python snippet and trace how partialmethod handles eq and ne. No file or test is named in the issue; done means both assignments and the comparison type-check without errors while the runtime behavior remains unchanged.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- devtools
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100