functions - python import module from path
¿Por qué una función importada "como" otro nombre mantiene su__name__ original? (3)
El as
es azúcar sintáctica en el archivo / sesión de la importación, mientras que el atributo __name__
es parte del objeto de función.
Aquí:
from os.path import exists as foo
print foo.__name__
obtenemos: ''exists''
. ¿Por qué no ''foo''
? ¿Qué atributo daría ''foo''
?
La importación de un objeto simplemente vincula una nueva variable , y todo lo que se agrega as newname
es permitirle elegir un nombre alternativo para la variable en el espacio de nombres actual.
El atributo __name__
en un objeto no dice nada sobre el nombre al que está vinculado actualmente, puede tener cualquier número de variables así como contenedores como listas o diccionarios que apuntan al mismo objeto, después de todo:
def foo(): pass
bar = foo
spam = foo
list_of_functions = [foo]
dictionary_of_functions = {''monty'': foo, ''python'': foo}
Lo anterior creó 4 referencias adicionales al objeto de función; no puede tener foo.__name__
reflejar todo eso, y las referencias en list_of_functions
y dictionary_of_functions
no tienen (directamente) nombres.
Desde la import foo
, la import bar as foo
, from module import foo
y from module import bar as foo
simplemente configuran el nombre foo
en el módulo actual, se tratan de la misma manera que otras asignaciones. Puede importar la función más de una vez, también con nombres diferentes.
En su lugar, el valor __name__
de una función se establece en el nombre con el que se definió en la instrucción def <name>(...):
Es una ayuda de depuración, a lo sumo. Se usa en rastreos, por ejemplo, para facilitar la identificación de las líneas de código que se muestran en el rastreo. Solo configuraría __name__
a otra cosa si eso ayudara a identificar mejor la ubicación. (Nota: en Python 3, también está el atributo __qualname_
, que se usa en lugar de __name__
ya que incluye más información sobre dónde se define la función cuando está anidada o definida en una clase)
Puede ver la import foo as bar
como una tarea. No esperaría que una función cambie su atributo __name__
cuando asigne otro nombre a la función.
>>> def foo(): pass
>>>
>>> foo.__name__
''foo''
>>> bar = foo
>>> bar.__name__
''foo''
Gracias. ¿Qué atributo de la
bar
variables devolvería la cadena''bar''
entonces?
No hay tal atributo. Los nombres ( bar
) se refieren a los valores (el objeto de la función) unidireccionalmente.
El atributo __name__
de una función se establece como el nombre con el que se definió la función usando el
def ...
sintaxis Es por eso que no obtiene un atributo __name__
significativo si define una función anónima y asigna el nombre foo
después de que se haya creado.
>>> foo = lambda: None
>>> foo.__name__
''<lambda>''