agronholm / agronholm/typeguard

Extend `TYPE_CHECKING` handling to classes and assignments

未關閉
#456 4 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視
bug
主要語言
Python
星號
1.8k
分支
146
平均合併
8 天 12 小時
30 天內合併 PR
1

描述

### Things to check first

- [X] I have searched the existing issues and didn't find my bug already reported there

- [X] I have checked that my bug is still present in the latest release

### Typeguard version

4.2.1

### Python version

3.12.3

### What happened?

`typechecked` code tries to use a class that is hidden behind `TYPE_CHECKING` and should not be required at runtime.

### How can we reproduce the bug?

`bug.py`
```python
# python bug.py && mypy bug.py && pyright bug.py

from __future__ import annotations

from typing import TYPE_CHECKING, TypedDict

# from typeguard import typechecked

if TYPE_CHECKING:

class Args(TypedDict):
x: int
y: int

# @typechecked
def bug() -> None:
args: Args = {"x": 1, "y": 1}
print(args)

bug()
```

`python bug.py && mypy bug.py && pyright bug.py`
```
{'x': 1, 'y': 1}
Success: no issues found in 1 source file
0 errors, 0 warnings, 0 informations
```

Now add the `@typechecked` decorator, and run `python bug.py` again:

```
Traceback (most recent call last):
File "C:\Code\project\bug.py", line 22, in
bug()
File "C:\Code\project\bug.py", line 18, in bug
args: Args = {"x": 1, "y": 1}
^^^^
NameError: name 'Args' is not defined. Did you mean: 'args'?
```

One workaround is to add `bug2.py`:
```python
from typing import TypedDict

class Args(TypedDict):
x: int
y: int
```

and modify `bug.py` to
```python
# python bug.py && mypy bug.py && pyright bug.py

from __future__ import annotations

from typing import TYPE_CHECKING

from typeguard import typechecked

if TYPE_CHECKING:
from bug2 import Args

@typechecked
def bug() -> None:
args: Args = {"x": 1, "y": 1}
print(args)

bug()
```

But that feels kind of unnecessary, I think.

貢獻指南

開啟貢獻指南

評估

這個 Issue 還沒有評估資料。

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。