I don't think this proposal is a good solution for the problems of static typing users.
El vie, 22 abr 2022 a las 18:16, Larry Hastings (<la...@hastings.org>) escribió: > But the explosion of static type analysis in Python, particularly with > the `typing` module and the `mypy` tool, has made circular definition-time > dependencies between classes commonplace--and much harder to solve. Here's > one simple example: > > ```Python > class A: > value: B > > class B: > value: A > ``` > > So to reiterate, your proposal would be to write this as: forward class B: pass class A: value: B continue class B: value: A While the current workaround is: class A: value: "B" class B: value: "A" I don't think I would write the "forward class" version if I had the choice. It's clunkier and requires more refactoring if I change my mind about whether the `value` attribute should exist. I'd prefer if we found some elegant way to get the natural way to write this code to work, which is the way you wrote it in your post (with no explicit declarations or stringifications). Carl Meyer's idea at https://github.com/larryhastings/co_annotations/issues/2#issuecomment-1092432875 is a very promising approach that should allow us to do that. I also agree with Mehdi2277's concern that this feature would be difficult for static type checkers to fully implement, because class declaration and implementation may be widely separated. To be sure, static checkers can put in additional restrictions, like requiring declaration and implementation to be in the same module, but it would be unfortunate if a feature designed to help users of static typing actually makes it harder to adopt it. ----- That said, one nice thing about the proposal is that it can help with forward references outside of annotations, a problem which neither PEP 563 nor 649 currently solves. Those include type aliases (MyAlias = Sequence["A | B"]) and TypeVar bounds (Typevar("AT", bound="A | B")). However, it doesn't solve the problem for base classes. For example, str is conceptually defined as `class str(Sequence["str"]):`. A forward reference can't make `str` defined when the bases are evaluated, because bases are resolved at the `forward class` stage.
_______________________________________________ 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/F7L4SU3QIQLPOYHJF5RNJLROF4VMJTMK/ Code of Conduct: http://python.org/psf/codeofconduct/