Antes de explicar algo al respecto if __name__ == '__main__'
, es importante comprender qué __name__
es y qué hace.
¿Qué es __name__
?
__name__
es un DunderAlias : puede considerarse como una variable global (accesible desde módulos) y funciona de manera similar a global
.
Es una cadena (global como se mencionó anteriormente) como lo indica type(__name__)
(cediendo <class 'str'>
), y es un estándar incorporado para las versiones Python 3 y Python 2 .
Dónde:
No solo se puede usar en scripts, sino que también se puede encontrar tanto en el intérprete como en los módulos / paquetes.
Interprete:
>>> print(__name__)
__main__
>>>
Guión:
test_file.py :
print(__name__)
Resultando en __main__
Módulo o paquete:
somefile.py:
def somefunction():
print(__name__)
test_file.py:
import somefile
somefile.somefunction()
Resultando en somefile
Tenga en cuenta que cuando se usa en un paquete o módulo, __name__
toma el nombre del archivo. La ruta del módulo real o la ruta del paquete no se proporciona, pero tiene su propio DunderAlias __file__
, que lo permite.
Debería ver que, dónde __name__
, dónde está el archivo principal (o programa) siempre devolverá__main__
, y si es un módulo / paquete, o cualquier cosa que se ejecute con algún otro script de Python, devolverá el nombre del archivo donde está se originó a partir de.
Práctica:
Ser una variable significa que su valor puede sobrescribirse ("can" no significa "debería"), sobrescribir el valor de __name__
dará como resultado una falta de legibilidad. Así que no lo hagas, por ningún motivo. Si necesita una variable, defina una nueva variable.
Siempre se supone que el valor de __name__
ser__main__
o el nombre del archivo. Una vez más, cambiar este valor predeterminado causará más confusión de que será bueno, causando problemas más adelante.
ejemplo:
>>> __name__ = 'Horrify' # Change default from __main__
>>> if __name__ == 'Horrify': print(__name__)
...
>>> else: print('Not Horrify')
...
Horrify
>>>
Se considera una buena práctica en general incluir los if __name__ == '__main__'
scripts en.
Ahora para responder if __name__ == '__main__'
:
Ahora sabemos el comportamiento de __name__
cosas se vuelve más claro:
Una if
es una instrucción de control de flujo que contiene el bloque de código que se ejecutará si el valor dado es verdadero. Hemos visto que __name__
puede tomar cualquiera
__main__
o el nombre del archivo desde el que se importó.
Esto significa que si __name__
es igual a, __main__
entonces el archivo debe ser el archivo principal y en realidad debe estar ejecutándose (o es el intérprete), no un módulo o paquete importado al script.
Si efectivamente __name__
toma el valor de __main__
lo que esté en ese bloque de código, se ejecutará.
Esto nos dice que si el archivo que se está ejecutando es el archivo principal (o si se está ejecutando directamente desde el intérprete), esa condición debe ejecutarse. Si es un paquete, entonces no debería, y el valor no será __main__
.
Módulos:
__name__
también se puede usar en módulos para definir el nombre de un módulo
Variantes:
También es posible hacer otras cosas, menos comunes pero útiles __name__
, algunas que mostraré aquí:
Ejecutar solo si el archivo es un módulo o paquete:
if __name__ != '__main__':
# Do some useful things
Ejecutando una condición si el archivo es el principal y otra si no lo es:
if __name__ == '__main__':
# Execute something
else:
# Do some useful things
También puede usarlo para proporcionar funciones / utilidades de ayuda ejecutables en paquetes y módulos sin el uso complejo de bibliotecas.
También permite ejecutar módulos desde la línea de comandos como scripts principales, lo que también puede ser muy útil.
if __name__ == "__main__":
condición de bloque ha quedado obsoleta / obsoleta hasta Python 3? He encontrado información que lo indica.