2011-11-22 31 views
8

Duplicar posible:
What does <if name==“main”:> do?¿Qué significa `if name ==" __main __ "` en Python?

he escrito guiones en Python durante bastante tiempo y ahora estudiar más de Python como lo necesito. Al leer el código de otras personas me encuentro con if name == "__main__": construir con bastante frecuencia.

¿Para qué sirve?

+1

Oh, ya veo ... 'si __name __ = "__ __ principal":' cheques marchitan el guión es un autónomo o un módulo. – Adobe

+1

Para copiadores y/o para evitar confusiones, tenga en cuenta el error en el comentario anterior: 'if __name __ ==" __ main __ ":' – alberto

Respuesta

20

Esto le permite usar el mismo archivo como una biblioteca (importándola) o como el punto de partida para una aplicación.

Por ejemplo, considere el siguiente archivo:

# hello.py 
def hello(to=__name__): 
    return "hello, %s" % to 

if __name__ == "__main__": 
    print hello("world") 

puede utilizar ese código de dos maneras. Por un lado, puede escribir un programa que lo importe. Si importa la biblioteca, __name__ será el nombre de la biblioteca y por lo tanto la comprobación fallará, y el código no se ejecutará (que es el comportamiento deseado):

#program.py 
from hello import hello # this won't cause anything to print 
print hello("world") 

Si no desea escribir este segundo archivo, puede ejecutar directamente el código de la línea de comandos con algo como:

$ python hello.py 
hello, __main__ 

este comportamiento todo depende de la variable __name__ especial que pitón fijará en función de si la biblioteca ha sido importada o ejecutar directamente por la Interprete. Si se ejecuta directamente, se establecerá en __main__. Si se importa, se establecerá en el nombre de la biblioteca (en este caso, hello).

A menudo este constructo se usa para agregar pruebas de unidad a su código. De esta manera, cuando escribe una biblioteca, puede insertar el código de prueba directamente en el archivo sin preocuparse de que se ejecute cuando la biblioteca se utiliza de la manera normal. Cuando desee probar la biblioteca, no necesita ningún marco porque puede ejecutar la biblioteca como si fuera un programa.

Ver también __main__ in the python documentation (aunque es muy escasa)

3

Básicamente,

Hay una distinción entre el archivo "principal" secuencia de comandos y archivos externos que fueron importados o referencia de otra manera. Si el script es el script "principal", la variable especial __name__ será igual a "__main__".

Puede usar esto para proteger el código de "ejecución" de las clases y variables que tiene el script. Esto le permite importar una secuencia de comandos y usar clases y variables sin ejecutar realmente el código principal de esa secuencia de comandos si tiene alguna.

+0

Bonus-trivia: ¿Qué encuentra en __name__ si importa un módulo que pasa a llamarse "__main__"? – Agrajag