Python Language
La variable especial __name__
Buscar..
Introducción
La variable especial __name__
se usa para verificar si un archivo ha sido importado como un módulo o no, y para identificar una función, clase, objeto de módulo por su atributo __name__
.
Observaciones
La variable especial de Python __name__
se establece en el nombre del módulo que lo contiene. En el nivel superior (como en el intérprete interactivo, o en el archivo principal) se establece en '__main__'
. Esto se puede usar para ejecutar un bloque de instrucciones si un módulo se ejecuta directamente en lugar de importarse.
El atributo especial relacionado obj.__name__
se encuentra en las clases, los módulos y las funciones importadas (incluidos los métodos) y proporciona el nombre del objeto cuando se define.
__name__ == '__main__'
La variable especial __name__
no es establecida por el usuario. Se utiliza principalmente para verificar si el módulo se está ejecutando solo o no porque se realizó una import
. Para evitar que su módulo ejecute ciertas partes de su código cuando se importa, verifique if __name__ == '__main__'
.
Deje que module_1.py tenga una sola línea de largo:
import module2.py
Y veamos que pasa, dependiendo de module2.py.
Situación 1
módulo2.py
print('hello')
Ejecutando module1.py imprimirá hello
Ejecutando module2.py imprimirá hello
Situación 2
módulo2.py
if __name__ == '__main__':
print('hello')
Ejecutando module1.py no imprimirá nada
Ejecutando module2.py imprimirá hello
function_class_or_module .__ name__
El atributo especial __name__
de una función, clase o módulo es una cadena que contiene su nombre.
import os
class C:
pass
def f(x):
x += 2
return x
print(f)
# <function f at 0x029976B0>
print(f.__name__)
# f
print(C)
# <class '__main__.C'>
print(C.__name__)
# C
print(os)
# <module 'os' from '/spam/eggs/'>
print(os.__name__)
# os
Sin embargo, el atributo __name__
no es el nombre de la variable que hace referencia a la clase, el método o la función, sino que es el nombre que se le asigna cuando se define.
def f():
pass
print(f.__name__)
# f - as expected
g = f
print(g.__name__)
# f - even though the variable is named g, the function is still named f
Esto se puede utilizar, entre otros, para la depuración:
def enter_exit_info(func):
def wrapper(*arg, **kw):
print '-- entering', func.__name__
res = func(*arg, **kw)
print '-- exiting', func.__name__
return res
return wrapper
@enter_exit_info
def f(x):
print 'In:', x
res = x + 2
print 'Out:', res
return res
a = f(2)
# Outputs:
# -- entering f
# In: 2
# Out: 4
# -- exiting f
Utilizar en el registro
Al configurar la funcionalidad de logging
incorporada, un patrón común es crear un registrador con el __name__
del módulo actual:
logger = logging.getLogger(__name__)
Esto significa que el nombre completo del módulo aparecerá en los registros, lo que facilitará ver de dónde provienen los mensajes.