On Thu, Aug 06, 2020 at 11:22:38AM +1000, Chris Angelico wrote:
On Thu, Aug 6, 2020 at 11:11 AM Steven D'Aprano firstname.lastname@example.org wrote:
That should be possible by doing `fred = my_property(42)` and defining `__set_name__` on the `my_property` class.
Just because you define your own dunder method (which you shouldn't do, since dunders are reserved for the interpreter's use) doesn't make something which is a syntax error stop being a syntax error.
This isn't "defining your own dunder". The syntax as described already works inside a class:
class my_property: def __init__(self, n): self.n = n def __set_name__(self, cls, name): print("I'm a property %r on class %s" % (name, cls.__name__))
class X: fred = my_property(42)
I'm a property 'fred' on class X
When did this happen?
I'm on Python-Ideas, Python-Dev, and I get announcements of new issues on the bug tracker, and I don't recall ever seeing this feature discussed.
[looks up the docs]
Okay, apparently it was added in 3.6. But the documentation says:
""" When using the default metaclass type, or any metaclass that ultimately calls type.__new__, the following additional customisation steps are invoked after creating the class object:
first, type.__new__ collects all of the descriptors in the class namespace that define a __set_name__() method; """
but that's not what is happening here, since my_property is not a descriptor, it's just an arbitrary instance.
(To be a descriptor, it needs to have `__get__` and/or `__set__` methods.)
Have I missed something or does this need a documentation fix?