typing_extensions icon indicating copy to clipboard operation
typing_extensions copied to clipboard

`Required`/`NotRequired` don't work with `__future__.annotations`

Open jcrist opened this issue 3 years ago • 7 comments

Required/NotRequired aren't properly detected when from __future__ import annotations is used, leading to incorrect __required_keys__/__optional_keys__ sets.

Reproduced with 4.3.0.

from __future__ import annotations  # comment this line out and things work correctly
from typing_extensions import NotRequired, TypedDict

class Test(TypedDict):
    a: int
    b: NotRequired[int]

assert Test.__required_keys__ == {"a"}
assert Test.__optional_keys__ == {"b"}
$ python test.py
Traceback (most recent call last):
  File "/home/jcristharif/Code/test.py", line 8, in <module>
    assert Test.__required_keys__ == {"a"}
AssertionError

jcrist avatar Jul 11 '22 17:07 jcrist

What Python version are you running? Does this reproduce with typing too on Python 3.11?

JelleZijlstra avatar Jul 11 '22 18:07 JelleZijlstra

I don't have (easy) access to a 3.11 build, but it reproduces with 4.3.0 on both 3.10 and 3.9.

jcrist avatar Jul 11 '22 18:07 jcrist

I can reproduce using typing.TypedDict and typing.NotRequired on the CPython main branch (3.12), so I assume it reproduces on 3.11 using the stdlib typing module as well.

AlexWaygood avatar Jul 12 '22 13:07 AlexWaygood

just ran into this issue with 4.3.0 and python 3.7.6 - any fix in the works? thanks!

yixun-alpha avatar Sep 02 '22 08:09 yixun-alpha

So is this fixed by #60 or not? It seems to be an issue with the upstream cpython typing module as well -- did someone already file an issue there? Please link it here.

gvanrossum avatar Sep 02 '22 16:09 gvanrossum

#60 would fix this in simple cases, but I think it will cause more problems than it solves. I'm inclined to wontfix this. Maybe we can revisit once there's a resolution on the PEP 563/649 saga.

JelleZijlstra avatar Sep 02 '22 17:09 JelleZijlstra

It's fine to not want to solve this for now. In fact one could argue that, since the point of from __future__ import annotations is not to incur runtime costs, you get what you ask for. (Not sure if that's totally fair, but it's a possible POV.)

gvanrossum avatar Sep 02 '22 18:09 gvanrossum

I'm closing this here in favor of python/cpython#97727. It seems that the consensus is that it's too complex to fix and will go away by itself at some distant point in the future when the future import isn't required anymore.

srittau avatar Sep 02 '24 19:09 srittau