Skip to content

False positive comparison-overlap for nested function and nested class #15083

@moben

Description

@moben

Bug Report

Nested functions inside methods incorrectly resolve attributes of their first argument relative to the surrounding class.

To Reproduce

class foo:
    a: str = "foo"
    
class bar:
    class a:
        pass
    
    def test(self) -> None:
        def inner1(f: foo, s: str) -> bool:
            return f.a == s
        
        def inner2(s: str, f: foo) -> bool:
            return f.a == s

https://mypy-play.net/?mypy=latest&python=3.11&flags=strict&gist=4c27f653074cd1c3a48bb16f49ca2168

Expected Behavior

As far as I can tell this should be valid code, even though this rarely happens in practice due to CamelCase vs snake_case naming conventions.

Actual Behavior

inner1 fails to type-check, because the a attribute is incorrectly assumed to be the a class inside bar

main.py:10: error: Non-overlapping equality check (left operand type: "Type[a]", right operand type: "str")  [comparison-overlap]

Interestingly, inner2 is fine.

Your Environment

  • Mypy version used: 1.2.0
  • Mypy command-line flags: --strict
  • Mypy configuration options from mypy.ini (and other config files): none
  • Python version used: 3.11

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugmypy got something wrong

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions