Skip to content

"Cannot determine type" if first assignment to attribute is unreachable #9709

Open
@mthuurne

Description

@mthuurne

To Reproduce

Run mypy on the following code:

class C:
    def __init__(self, a: str) -> None:
        if a is None:
            self.x = 123
        else:
            self.x = 456

It will output:

testcase.py:6: error: Cannot determine type of 'x'

Line 6 contains the second assignment to self.x.

Expected Behavior

mypy should be able to determine that the type of C.x is int.

Actual Behavior

The fact that a is annotated as str means that mypy determines that a is None is never true and therefore the first assignment to self.x is unreachable. The problem disappears if a is annotated as Optional[str].

So it looks like mypy half-ignores the first assignment to self.x: it doesn't use the type information available there since the code is unreachable, but it still considers it the assignment that determines the type of self.x.

Your Environment

mypy 0.790 with default configuration, running on Python 3.8.5 on openSUSE Linux.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugmypy got something wrongtopic-inferenceWhen to infer types or require explicit annotationstopic-reachabilityDetecting unreachable code

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions