Emit error for "raise NotImplemented" by brianschubert · Pull Request #17890 · python/mypy (original) (raw)

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.