Nick Coghlan added the comment:

Carl's patch looks good to me, but my one request in relation to the __slots__ 
situation would be to give it a custom error message better indicating that 
lazy initialization of pre-assigned instance slots isn't supported.

Currently that case just lets the underlying AttributeError escape, which is 
going to be thoroughly cryptic for folks that try it and may look like an 
accidental oversight rather than a deliberate design decision:

    >>> class NoDict:
    ...     __slots__ = ()
    ... 
    >>> NoDict().__dict__
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'NoDict' object has no attribute '__dict__'

Suggested error message:

    TypeError: No '__dict__' attribute on 'objtype' instance to cache 
'attrname' property.

Essentially, this line:

    val = instance.__dict__[self.func.__name__] = self.func(instance)

would become:

    attrname = self.func.__name__
    try:
        cache = instance.__dict__
    except AttributeError:
        msg = f"No '__dict__' attribute on {type(instance).__name__!r} instance 
to cache {attrname!r} property."
        raise TypeError(msg) from None
    val = cache[attrname] = self.func(instance)


I believe a future C implementation could potentially be reworked to be 
__slots__ compatible, but I'd have to go read the source code to be sure, and I 
don't think that's necessary.

Note: the class machinery itself already detects actual name conflicts between 
slot and method definitions:

    >>> class SlotConflict:
    ...     __slots__ = ("attr")
    ...     @property
    ...     def attr(self):
    ...         return 42
    ... 
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: 'attr' in __slots__ conflicts with class variable

The requested runtime check for the `__dict__` AttributeError covers the case 
where __slots__ is defined, and the cached property *isn't* listed as one of 
the instance attributes, but neither is __dict__.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue21145>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to