On 09/14/2017 12:08 PM, Ivan Levkivskyi wrote:
On 14 September 2017 at 01:13, Guido van Rossum 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! :-)

For comparison's sake, what would the above look like using __class__ 
assignment?  And what is the performance difference?

--
~Ethan~

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to