Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extend TYPE_CHECKING handling to classes and assignments #456

Open
2 tasks done
bersbersbers opened this issue Apr 25, 2024 · 0 comments
Open
2 tasks done

Extend TYPE_CHECKING handling to classes and assignments #456

bersbersbers opened this issue Apr 25, 2024 · 0 comments
Labels

Comments

@bersbersbers
Copy link

Things to check first

  • I have searched the existing issues and didn't find my bug already reported there

  • 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 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 <module>
    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:

from typing import TypedDict

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

and modify bug.py to

# 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant