¿Qué es __qualname__ en Python?

3 minutos de lectura

Avatar de usuario de Lord Elrond
señor elrond

  • Qué es __qualname__ en python y cómo es útil?

  • ¿Por qué tendría que usarlo más __name__?

yo leo el documentospero no me ayudaron a obtener una comprensión clara de su utilidad.

He leído Obtener el nombre completo de una clase de Python (Python 3.3+).
esa pregunta se hace “cómo obtener un nombre calificado”que supone que uno conoce el significado de “nombre calificado”. Obviamente, la respuesta a esa pregunta es usar el __qualname__ atributo.

mi pregunta es qué __qualname__ es y por qué ¿debería usarlo otra vez? __name__.

  • @Selcuk ¿Cómo es eso un duplicado? estoy preguntando que __qualname__ es y cómo se usa, no ¿Cómo obtengo el nombre completo?

    – Señor Elrond

    26 de septiembre de 2019 a las 1:49

  • La pregunta que vinculó no tiene explicación sobre lo que hace o para qué se usa.

    – Señor Elrond

    26 de septiembre de 2019 a las 1:50

  • You are looking for __qualname__ (introduced in Python 3.3):

    – Señor Elrond

    26 de septiembre de 2019 a las 1:53

  • No lo considero una explicación de lo que __qualname__ es.

    – Señor Elrond

    26 de septiembre de 2019 a las 1:53

  • Es posible que desee explicar por qué los documentos no lo ayudaron a comprender qué es un nombre calificado. Encuentro la explicación bastante sencilla. Ayudarnos a comprender su falta de comprensión nos ayuda a proporcionar una explicación adecuada que, con suerte, lo ayudará a comprender.

    –Max Vollmer

    26 de septiembre de 2019 a las 4:48

__qualname__ da información más completa que __name__ y por lo tanto puede ser más útil en la depuración, por ejemplo.

Ejemplo:

>>> def f(): pass
... class A:
...    def f(self): pass
...    class A:
...        def f(self): pass
...
>>> # __name__ is not showing the path, so these functions look equal
>>> f.__name__
'f'
>>> A.f.__name__
'f'
>>> A.A.f.__name__
'f'
>>> # And these classes looks equal
>>> A.__name__
'A'
>>> A.A.__name__
'A'
>>>
>>> # __qualname__ shows the path, so these functions are distinguishable
>>> f.__qualname__
'f'
>>> A.f.__qualname__
'A.f'
>>> A.A.f.__qualname__
'A.A.f'
>>> # And these classes are distinguishable
>>> A.__qualname__
'A'
>>> A.A.__qualname__
'A.A'

__qualname__ también está agregando algo de compatibilidad con versiones anteriores de Python 2 .im_class.

Más detalles en la justificación del PEP 3155

  • Esto no solo ayuda con la depuración, sino que también es tremendamente útil cuando se realizan parches mono para evitar falsos positivos al verificar si la función original es la esperada.

    – blubberdiblub

    22 de septiembre de 2021 a las 6:43

Solo para (potencialmente) agregar a la respuesta anterior, __qualname__ también se puede llamar desde dentro de una clase, sin tener que estar vinculado a ningún método. Esto permite obtener el nombre de una clase desde dentro de la clase cuando no tiene un __init__ método definido:

class myClass:
    print(__qualname__)

Esto devolverá:

myClass

Un escenario práctico en el que encontré esto útil es cuando se trabaja con logging. Si desea implementarlo en un módulo con una clase que, como se dijo antes, no tiene un __init__ método, es decir, consiste solo en métodos de clase, luego para agregar el nombre de la clase a la ruta de notación de puntos que logging requiere unir los registros generados por diferentes módulos en uno solo, __qualname__ parece una solución fácil.

  • Además de iniciar sesión, también es útil si está escribiendo un archivo personalizado. __repr__ o __str__

    – casi_ansiedad

    29 de diciembre de 2022 a las 23:15

¿Ha sido útil esta solución?