3 votes

Comment réimplémenter __qualname__ de Python dans Python 3.7 (avec quelques ajustements mineurs) ?

En __qualname__ est utile pour moi car il contextualise les fonctions ; cependant, il est difficile pour moi de l'utiliser dans mon cas d'utilisation car :

  1. __qualname__ renvoie une chaîne de caractères. Dans mon cas d'utilisation, j'ai besoin de références à l'objet (aux objets) parent(s).

  2. __qualname__ renvoie parfois le super au lieu de la classe référencée. Par exemple :

    class Parent():
    
        def __init__(self):
            pass
    
    class Child(Parent):
        pass
    
    print(Child.__init__.__qualname__)  # Prints: "Parent.__init__"
  3. Le paquet que je suis en train de développer doit être robuste, et les cas limites de __qualname__ ne sont pas documenté pour autant que je sache.

En dehors de analyse du fichier Python con ast , peut __qualname__ peut-elle être réimplémentée en Python3 avec inspection ? Comment Python implémente-t-il __qualname__ ? En réimplémentant la fonctionnalité de base, je pense pouvoir l'adapter à mon cas d'utilisation.


Recherches antérieures :

Je n'ai pas réussi à trouver l'implémentation de qualname dans le code source de Python.

3voto

user2357112 Points 37737

Vous n'obtiendrez pas ce que vous voulez. Vous voulez your_thing(Parent.__init__) de dire quelque chose à propos de Parent y your_thing(Child.__init__) de dire quelque chose à propos de Child pero Parent.__init__ y Child.__init__ sont exactement le même objet.

Vous avez accédé à cet objet de deux manières différentes, mais Python n'en garde aucune trace. Ce que vous implémentez ne recevra qu'un objet fonction, sans les informations que vous recherchez.

Même si l'on procède à une horrible inspection de la pile pour vérifier que le code source de your_thing(Child.__init__) indique "Enfant", cela ne fonctionnera pas dans les cas où la fonction est stockée dans une variable ou transmise à travers quelques couches supplémentaires d'appels de fonction. Cela ne fonctionnera, de manière peu fiable, que pour une fraction des cas où vous n'en avez pas besoin parce que vous aviez déjà l'information que vous vouliez lorsque vous avez écrit le code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X