`Required`/`NotRequired` don't work with `__future__.annotations`
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
What Python version are you running? Does this reproduce with typing too on Python 3.11?
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.
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.
just ran into this issue with 4.3.0 and python 3.7.6 - any fix in the works? thanks!
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.
#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.
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.)
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.