builtins: NotImplemented is not callable by hauntsaninja · Pull Request #4222 · python/typeshed (original) (raw)
JukkaL pushed a commit to python/mypy that referenced this pull request
Refs #5710
Adds special-case handling for raising NotImplemented
:
raise NotImplemented # E: Exception must be derived from BaseException; did you mean "NotImplementedError"?
Per the linked issue, there's some debate as to how to best handle
NotImplemented
. This PR special-cases its behavior in raise
statements, whereas the leaning in the issue (at the time it was opened)
was towards updating its definition in typeshed and possibly
special-casing its use in the relevant dunder methods.
Going the typeshed/special-dunder route may still happen, but it hasn't
in the six years since the issue was opened. It would be nice to at
least catch errors from raising NotImplemented
in the interim.
Making this change also uncovered a regression introduced in
python/typeshed#4222. Previously, NotImplemented
was annotated as
Any
in typeshed, so returning NotImplemented
from a non-dunder would
emit an error when --warn-return-any
was used:
class A:
def some(self) -> bool: return NotImplemented # E: Returning Any from function declared to return "bool"
However, in python/typeshed#4222, the type of NotImplemented
was
updated to be a subclass of Any
. This broke the handling of
--warn-return-any
, but it wasn't caught since the definition of
NotImplemented
in fixtures/notimplemented.pyi
wasn't updated along
with the definition in typeshed. As a result, current mypy doesn't emit
an error here
(playground),
despite having a test case saying that it should. As a bandaid, this PR
add special handling for NotImplemented
in return statements to treat
it like an explicit Any
, restoring the pre- python/typeshed#4222
behavior.