8000 Call __set_name__ for class members on class creation. · Issue #15501 · micropython/micropython · GitHub
[go: up one dir, main page]

Skip to content
Call __set_name__ for class members on class creation. #15501
Open
@AJMansfield

Description

@AJMansfield

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementFeature requests, new feature implementations

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      0