modules functions from all python function module python-import

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>''