[Python-Dev] PEP 549: Instance Properties (aka: module properties) (original) (raw)
Larry Hastings larry at hastings.org
Sun Sep 10 23:42:11 EDT 2017
- Previous message (by thread): [Python-Dev] PEP 549: Instance Properties (aka: module properties)
- Next message (by thread): [Python-Dev] PEP 549: Instance Properties (aka: module properties)
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On 09/06/2017 08:26 AM, Guido van Rossum wrote:
So we've seen a real use case for class assignment: deprecating things on access. That use case could also be solved if modules natively supported defining getattr (with the same "only used if attribute not found otherwise" semantics as it has on classes), but it couldn't be solved using @property (or at least it would be quite hacky).
I guess it's a matter of perspective. I solved this problem using @property, and I don't think it's particularly hacky. (See my implementation at the bottom of this email). The worst thing it does is look up the current module via sys.modules[name]... which Nathaniel's code also must do.
My example is a lot simpler than Nathaniel's code but it's just a proof-of-concept. Nathaniel's code does much more. In particular, I didn't override dir to hide the deprecated attributes; doing that would mean assigning to class just as Nathaniel does. (If you're actually curious to see it I could add that to the proof-of-concept.)
IMO my PEP strikes the right balance. @property is far more popular than getattr or getattribute; 19 times out of 20, people use @property. Meanwhile, people for whom @property is insufficient (like Nathaniel) can already assign to module.class and override getattr, getattribute, del, or any other existing magic method. In other words: the commonplace is easy, and the unusual is possible. Perfect!
//arry
/test_deprecated.py:
import depmod
print(depmod.depr1) # throws an exception
depmod.py:
# module with deprecated properties
import sys
_deprecated_properies = (
("depr1", 33),
("depr2", 44),
)
__module__ = sys.modules[__name__]
def set_deprecated_property(name, value):
@property
def prop(self):
raise RuntimeError(f"property '{name}' is deprecated")
return value
setattr(__module__, name, prop)
for name, value in _deprecated_properies:
set_deprecated_property(name, value)
-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.python.org/pipermail/python-dev/attachments/20170910/0bd0b413/attachment.html>
- Previous message (by thread): [Python-Dev] PEP 549: Instance Properties (aka: module properties)
- Next message (by thread): [Python-Dev] PEP 549: Instance Properties (aka: module properties)
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]