[Python-Dev] PEP 549: Instance Properties (aka: module properties)

Ethan Furman ethan at stoneleaf.us
Thu Sep 14 16:07:55 EDT 2017


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~



More information about the Python-Dev mailing list