On Tue, Apr 13, 2021 at 9:57 AM Larry Hastings <la...@hastings.org> wrote: > > > On 4/12/21 4:50 PM, Inada Naoki wrote: > > PEP 563 solves all problems relating to types not accessible in runtime. > There are many reasons users can not get types used in annotations at runtime: > > * To avoid circular import > * Types defined only in pyi files > * Optional dependency that is slow to import or hard to install > > It only "solves" these problems if you leave the annotation as a string. If > PEP 563 is active, but you then use typing.get_type_hints() to examine the > actual Python value of the annotation, all of these examples will fail with a > NameError. So, in this case, "solves the problem" is a positive way of > saying "hides a runtime error". >
Of course, "get type which is unavailable in runtime" is unsolvable problem. PEP 597 doesn't solve it too. Author needs to quote the hint manually, and `typing.get_type_hints()` raises NameError too. And if author forget to quote, user can not get any type hints. > I don't know what the use cases are for examining type hints at runtime, so I > can't speak as to how convenient or inconvenient it is to deal with them > strictly as strings. But it seems to me that examining annotations as their > actual Python values would be preferable. > This is use cases for examining type hints at runtime and stringified hints are OK. * Sphinx autodoc * help() * IPython and other REPLS showing type hint in popup. > > ``` > from dataclasses import dataclass > > if 0: > from fakemod import FakeType > > @dataclass > class C: > a : FakeType = 0 > ``` > > This works on PEP 563 semantics (Python 3.10a7). User can get > stringified annotation. > > With stock semantics, it cause NameError when importing so author can > notice they need to quote "FakeType". > > With PEP 649 semantics, author may not notice this annotation cause > error. User can not get any type hints at runtime. > > Again, by "works on PEP 563 semantics", you mean "doesn't raise an error". > But the code has an error. It's just that it has been hidden by PEP 563 > semantics. > > I don't agree that changing Python to automatically hide errors is an > improvement. As the Zen says: "Errors should never pass silently." > > This is really the heart of the debate over PEP 649 vs PEP 563. If you > examine an annotation, and it references an undefined symbol, should that > throw an error? There is definitely a contingent of people who say "no, > that's inconvenient for us". I think it should raise an error. Again from > the Zen: "Special cases aren't special enough to break the rules." > Annotations are expressions, and if evaluating an expression fails because of > an undefined name, it should raise a NameError. > I agree that this is the heart of the debate. I think "annotations are for type hitns". They are for: * Static type checkers * document. So I don't think `if TYPE_CHECKING` idiom is violating Python Zen. Regards, -- Inada Naoki <songofaca...@gmail.com> _______________________________________________ Python-Dev mailing list -- python-dev@python.org To unsubscribe send an email to python-dev-le...@python.org https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/DAMYYG5CY6MGRCAKIWRA4IKXW75DYXW6/ Code of Conduct: http://python.org/psf/codeofconduct/