Skip to content

Mypy and Pyright complain when importing new NamedTuple #56

Closed
python/typeshed
#8295

Description

@gshaikovski

Hi,

I am trying to use generic NamedTuple from the new typing_extensions, however static checkers can't resolve its import.

Below is the code to reproduce and mypy errors as comments.

from typing import TypeVar, Generic

from typing_extensions import NamedTuple  # error: Module "typing_extensions" has no attribute "NamedTuple"

T_co = TypeVar('T_co', covariant=True)

class Foo(NamedTuple, Generic[T_co]):  # error: Class cannot subclass "NamedTuple" (has type "Any")
    bar: T_co

Not sure what the problem is. I see that there's a conditional here that checks for Python 3.11. It might be the case that type checkers can't resolve this statically. This is just a hypothesis though.

Environment

Python 3.8.10

typing_extensions==4.3.0
mypy==0.942

Activity

  1. added a commit that references this issue on Jul 14, 2022
  2. AlexWaygood commented on Jul 14, 2022

    @AlexWaygood
    Member

    I forgot to add it to the typeshed stub for typing_extensions -- the stub is all that the type checker sees :) python/typeshed#8295 should fix the issue.

    It might be worth noting, however, that mypy doesn't yet support generic NamedTuples (python/mypy#685) -- my typeshed PR will fix the import issue, but mypy will still emit errors if you try to actually use generic NamedTuples. I know pyright supports generic NamedTuples; not sure about pytype and pyre.

  3. gshaikovski commented on Jul 14, 2022

    @gshaikovski
    Author

    Great, thanks!

  4. gshaikovski commented on Jul 14, 2022

    @gshaikovski
    Author

    @AlexWaygood I see the fix was merged. I think the typeshed CI pipeline already ran too since then. How do I get this stub into my env? Thanks.

  5. JelleZijlstra commented on Jul 14, 2022

    @JelleZijlstra
    Member

    You have to wait for the next mypy or pyright release. We can probably get this into mypy 0.970 (expected soon), and pyright releases with updated stubs frequently.

  6. AlexWaygood commented on Jul 14, 2022

    @AlexWaygood
    Member

    In the meantime, if you're using mypy, one option is to clone typeshed's master branch and use mypy with the --custom-typeshed-dir option. Pyright might have a similar option you can use to override its vendored copy of typeshed, but I'm not sure.

  7. gshaikovski commented on Jul 14, 2022

    @gshaikovski
    Author

    Great thanks both!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions