Skip to content

builtins: NotImplemented is not callable #4222

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 11, 2020

Conversation

hauntsaninja
Copy link
Collaborator

Fixes #3315

Copy link
Member

@JelleZijlstra JelleZijlstra left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If mypy is fine with this, I'm fine with it too.

@JelleZijlstra JelleZijlstra merged commit ecb4314 into python:master Jun 11, 2020
@hauntsaninja hauntsaninja deleted the notimpl branch June 11, 2020 05:40
vishalkuo pushed a commit to vishalkuo/typeshed that referenced this pull request Jun 26, 2020
JukkaL pushed a commit to python/mypy that referenced this pull request Oct 9, 2024
Refs #5710

Adds special-case handling for raising `NotImplemented`:
```python
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:
```python
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](https://mypy-play.net/?mypy=1.11.2&python=3.12&flags=strict%2Cwarn-return-any&gist=8a78e3eb68b0b738f73fdd326f0bfca1)),
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

NotImplemented is not callable
2 participants