agronholm / typeguard

Run-time type checker for Python
Other
1.56k stars 114 forks source link

Inner classes are not recognized in annotations #482

Closed jolaf closed 2 months ago

jolaf commented 2 months ago

Things to check first

Typeguard version

4.3.0

Python version

3.12.3

What happened?

Traceback (most recent call last):
  File "/.../test.py", line 3, in <module>
    import A
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
  File "/home/.../.local/lib/python3.12/site-packages/typeguard/_importhook.py", line 98, in exec_module
    super().exec_module(module)
  File "/.../A.py", line 10, in <module>
    A()
  File "/.../A.py", line 7, in __init__
    def __init__(self, e: E = E.X) -> None:
                          ^
NameError: name 'E' is not defined. Did you mean: 'self.E'?

How can we reproduce the bug?

test.py:

from typeguard import install_import_hook
with install_import_hook(('A',)):
    import A

A.py:

from enum import Enum

class A:
    class E(Enum):
        X = 1

    def __init__(self, e: E = E.X) -> None:
        print("OK")

A()
$ python3 A.py
OK

$ python3 test.py
<crash>
jolaf commented 2 months ago

Sorry, duplicate of #402.