Class creation doesn't call __set_name__ when creating class members in another __set_name__
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 35.9k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Bug report
Bug description:
When inserting a class member during some other class member's __set_name__ call, the __set_name__ method of the newly-inserted member doesn't get called as expected.
As an example, take this snippet:
class I_Am_Altering_The_Deal:
def __set_name__(self, owner, name):
print(f"__set_name__({self.__class__.__name__}, {owner.__name__}, {name!r}")
owner.han_solo = Pray_I_Dont_Alter_It_Any_Further()
class Pray_I_Dont_Alter_It_Any_Further:
def __set_name__(self, owner, name):
print(f"__set_name__({self.__class__.__name__}, {owner.__name__}, {name!r}")
class Cloud_City:
luke_skywalker = I_Am_Altering_The_Deal()
I would expect both __set_name__ functions to be called, resulting in the output:
__set_name__(I_Am_Altering_The_Deal, Cloud_City, 'luke_skywalker')
__set_name__(Pray_I_Dont_Alter_It_Any_Further, Cloud_City, 'han_solo')
But what is actually output, is:
__set_name__(I_Am_Altering_The_Deal, Cloud_City, 'luke_skywalker')
Discovered while testing a PEP-487 implementation for Micropython: micropython/micropython#15503.
Maybe be related to #72983.
CPython versions tested on:
3.8, 3.10, 3.12
Operating systems tested on:
Linux
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par exécuter le snippet de création de classe de l’issue et comparez sa sortie avec les deux appels set_name attendus. Lisez l’implémentation de PEP-487 et l’issue associée #72983 ; le correctif est complet lorsqu’un membre inséré pendant l’appel set_name d’un autre membre reçoit son propre callback attendu, avec une couverture de régression.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- compilers
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 35/100