Description
Description
Add support for the __set_name__
data model method defined in Python 3.6.
https://docs.python.org/3/reference/datamodel.html#object.__set_name__
This functionality is important for using descriptors effectively. Often, it's used to construct associated attribute names for storing per-instance per-descriptor state:
class Descriptor:
def __set_name__(self, owner, name):
self.attr_name = "_{}_value".format(name)
def __get__(self, instance, owner=None):
return getattr(instance, self.attr_name)
def __set__(self, instance, value):
setattr(instance, self.attr_name, value)
def __delete__(self, instance):
delattr(instance, self.attr_name)
Or for registering instances of a descriptor with some abstracted meta-functionality in the parent:
class Field:
def __set_name__(self, owner, name):
self.name = name
owner._fields[self.name] = self
def __get__(self, instance, owner=None):
return instance._data[self.name]
class Structure:
_fields: dict = {}
def __init__(self, buf):
self._data = parse(buf, self._fields)
class S(Structure):
f = Field()
g = Field()
In order to implement this, code needs to be added to run at the end of a class-definition block, iterate through the class's namespace, and then call this method on any of the class members that define it.
Code Size
This could probably be gated behind whatever feature flag exists for descriptors more generally, but the implementation ought to be rather lightweight anyway.
Implementation
I intend to implement this feature and submit a pull request. I could use some guidance on locating where in the codebase class creation is handled.
In the interest of TDD, I've already created a test to check this feature here: #15500
Code of Conduct
Yes, I agree