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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow