Skip to content

Specify how type checkers should interpret __exit__ annotations #1535

@JelleZijlstra

Description

@JelleZijlstra

The typing spec should provide guidance on how type checkers should handle __exit__ annotations. This method is special because __exit__ methods can suppress exceptions, and whether or not they do so affects the control flow through a function.

In code like this:

a: int | None = None
with some_context():
    a = 1
reveal_type(a)

What is the type of a? It depends on whether some_context() can suppress exceptions or not. Most context managers don't, but in theory they can. A pedantically correct decision might be to assume that they can always suppress exceptions (so a might still be None in the sample), but that will often lead to a bad user experience.

Mypy currently follows a heuristic I proposed a few years ago. Should we formalize that heuristic into the spec, or something else?

This is important to specify because it affects how library authors should annotate their __exit__ methods. I'll probably pursue getting this into the spec in the next few months.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions