(sorry for obvious mistakes in the example in previous e-mail) On 14 September 2017 at 21:08, Ivan Levkivskyi <levkivskyi@gmail.com> wrote:
On 14 September 2017 at 01:13, Guido van Rossum <guido@python.org> wrote:
That last sentence is a key observation. Do we even know whether there are (non-toy) things that you can do *in principle* with __class__ assignment but which are too slow *in practice* to bother? And if yes, is __getattr__ fast enough? @property?
I myself have never implemented deprecation warnings management nor lazy loading, so it is hard to say if __class__ assignment is fast enough. For me it is more combination of three factors:
* modest performance improvement * some people might find __getattr__ clearer than __class__ assignment * this would be consistent with how stubs work
IMO we're still looking for applications.
How about this
def allow_forward_references(*allowed): caller_globals = sys._getframe().__globals__ def typing_getattr(name): if name in allowed: return name raise AttributeError(...) caller_globals.__getattr__ = typing_getattr
from typing_extensions import allow_forward_references allow_forward_references('Vertex', 'Edge')
T = TypeVar('T', bound=Edge)
class Vertex(List[Edge]): def copy(self: T) -> T: ...
class Edge: ends: Tuple[Vertex, Vertex] ...
Look mum, no quotes! :-)
-- Ivan