Original article: What’s in a (Python’s) __name__?

Una introducción a la variable __name__ y su uso en Python

Es muy probable que hayas visto la variable __name__ cuando has revisado código de Python. A continuación puedes ver un fragmento de código de ejemplo de cómo puede lucir:

if __name__ == '__main__':    main()

En este artículo quiero mostrarte cómo puedes hacer uso de esta variable para crear módulos en Python.

¿Por qué se usa la variable _ _name_ _ ?

La variable __name__ (dos guiones bajos antes y después) es una variable especial de Python. Toma su valor dependiendo de cómo se ejecute el script contenedor.

A veces escribes un script con funciones que también pueden ser útiles en otros scripts. En Python, puedes importar ese script como un módulo en otro script.

Gracias a esta variable especial, puedes decidir si quieres ejecutar ese script, o importar las funciones definidas en el mismo.

¿Qué valores puede contener la variable __name__ ?

Cuando ejecutas tu script, la variable __name__ es igual a __main__ . Cuando importas el script contenedor, contendrá el nombre del script.

Veamos estos dos casos de uso y describamos el proceso con dos ilustraciones.

Escenario 1 - Ejecutar el script

Supongamos que escribimos el script nombreScript.py de la siguiente manera:

def miFuncion():    print 'El valor de __name__ es ' + __name__
def main():    miFuncion()
if __name__ == '__main__':    main()

Si ejecutas nombreScript.py, se sigue el proceso de abajo.

PljpjxnM1OMMW7IkexNxVfwrKhP0RH-isapH


Antes de que ejecute cualquier otro código, la variable __name__ se establece a __main__. Después, las sentencias def de main y miFuncion se ejecutan. Debido a que la condición se evalúa a verdadero, la función main es llamada. Esta a su vez llama a miFuncion. Esto imprime el valor de __main__.

Escenario 2 - Importar el script en otro script

Si queremos reusar miFuncion en otro script, por ejemplo importandoScript.py, podemos importar nombreScript.py como un módulo.

El código enimportandoScript.py podría ser el siguiente:

import nombreScript as ns
ns.miFuncion()

Entonces tenemos dos ámbitos: uno de importandoScript y el segundo de nombreScript. En la imagen puedes ver como difiere del primer caso de uso.

k9OxzvJAP-s5qeZg88jUCOCVy1syrQu4oKds

En importandoScript.py la variable __name__ se establece a __main__. Al importar nombreScript, Python empieza a buscar un archivo agregando .py al nombre del módulo. Luego ejecuta el código contenido en el archivo importado.

Pero esta vez se establece a nombreScript; de nuevo las sentencias def para main y miFuncion son ejecutadas, pero ahora la condición evalúa a falso y main no es llamado.

En importandoScript.py llamamos a miFuncion que da como salida nombreScript. NombreScript es conocida por miFuncion cuando esa función fue definida.

Si imprimieras __name__ en importandoScript, saldría __main__. La razón de esto es que Python usa el valor conocido en el ámbito de importandoScript.

Conclusión

En este breve artículo, expliqué cómo puedes usar la variable __name__ para escribir módulos. También puedes ejecutar estos módulos por sí mismos. Esto se puede lograr al hacer uso de cómo los valores de estas variables cambian dependiendo de dónde ocurren.