Entendiendo el método principal de python

Soy nuevo en Python, pero tengo experiencia en otros idiomas de OOPS. Mi curso no explica el método principal en python.

Por favor, dime cómo funciona el método principal en python? Estoy confundido porque estoy tratando de compararlo con Java.

def main(): # display some lines if __name__ == "__main__": main() 

¿Cómo se ejecuta main y por qué necesito esto de forma extraña para ejecutar main ? Mi código termina sin salida cuando elimino el if .

El código mínimo –

 class AnimalActions: def quack(self): return self.strings['quack'] def bark(self): return self.strings['bark'] class Duck(AnimalActions): strings = dict( quack = "Quaaaaak!", bark = "The duck cannot bark.", ) class Dog(AnimalActions): strings = dict( quack = "The dog cannot quack.", bark = "Arf!", ) def in_the_doghouse(dog): print(dog.bark()) def in_the_forest(duck): print(duck.quack()) def main(): donald = Duck() fido = Dog() print("- In the forest:") for o in ( donald, fido ): in_the_forest(o) print("- In the doghouse:") for o in ( donald, fido ): in_the_doghouse(o) if __name__ == "__main__": main() 

El enfoque de Python a “main” es casi exclusivo del lenguaje (*).

La semántica es un poco sutil. El identificador __name__ está vinculado al nombre de cualquier módulo a medida que se importa. Sin embargo, cuando se ejecuta un archivo, entonces __name__ se establece en "__main__" (la cadena literal: __main__ ).

Casi siempre se usa para separar la parte del código que debe ejecutarse de las partes del código que definen la funcionalidad. Entonces, el código Python a menudo contiene una línea como:

 #!/usr/bin/env python from __future__ import print_function import this, that, other, stuff class SomeObject(object): pass def some_function(*args,**kwargs): pass if __name__ == '__main__': print("This only executes when %s is executed rather than imported" % __file__) 

Al usar esta convención, se puede tener un archivo para definir clases y funciones para usar en otros progtwigs, y también incluir código para evaluar solo cuando el archivo se llama como un script independiente.

Es importante entender que todo el código sobre la línea if __name__ se está ejecutando, evaluando, en ambos casos. Es evaluado por el intérprete cuando se importa el archivo o cuando se ejecuta. Si coloca una instrucción de print antes de la línea if __name__ , se imprimirá la salida cada vez que cualquier otro código intente importarlo como un módulo. (Por supuesto, esto sería antisocial . No hagas eso).

Yo, personalmente, me gustan estas semánticas. Alienta a los progtwigdores a separar la funcionalidad (definiciones) de la función (ejecución) y alienta la reutilización.

Idealmente, casi todos los módulos de Python pueden hacer algo útil si se les llama desde la línea de comandos. En muchos casos, esto se utiliza para gestionar las pruebas unitarias. Si un archivo en particular define una funcionalidad que solo es útil en el contexto de otros componentes de un sistema, entonces aún se puede usar __name__ == "__main__" para aislar un bloque de código que llama a un conjunto de pruebas unitarias que se aplican a este módulo.

(Si no va a tener ninguna de estas funcionalidades ni pruebas de unidad, es mejor asegurarse de que el modo de archivo NO sea ejecutable).

Resumen: if __name__ == '__main__': tiene dos casos de uso principales:

  • Permitir que un módulo proporcione funcionalidad para importar a otro código mientras que también proporciona una semántica útil como un script independiente (un contenedor de línea de comando alrededor de la funcionalidad)
  • Permita que un módulo defina un conjunto de pruebas unitarias que se almacenan con (en el mismo archivo que) el código que se va a probar y que se puede ejecutar independientemente del rest de la base de código.

Es bastante común def main(*args) y tener if __name__ == '__main__': simplemente llame a main(*sys.argv[1:]) si desea definir main de una manera similar a otros lenguajes de progtwigción. Si su archivo .py está destinado principalmente para ser utilizado como un módulo en otro código, entonces podría def test_module() y llamar a test_module() en su if __name__ == '__main__:' suite.

  • (Ruby también implementa una función similar if __file__ == $0 ).

En Python, la ejecución NO tiene que comenzar en main. La primera línea de “código ejecutable” se ejecuta primero.

 def main(): print("main code") def meth1(): print("meth1") meth1() if __name__ == "__main__":main() ## with if 

Salida –

 meth1 main code 

Más en main () – http://ibiblio.org/g2swap/byteofpython/read/module-name.html

El __name__ un módulo

Cada módulo tiene un nombre y las declaraciones en un módulo pueden averiguar el nombre de su módulo. Esto es especialmente útil en una situación particular: como se mencionó anteriormente, cuando un módulo se importa por primera vez, se ejecuta el bloque principal de ese módulo. ¿Qué sucede si queremos ejecutar el bloque solo si el progtwig se usó solo y no cuando se importó de otro módulo? Esto se puede lograr utilizando el atributo de nombre del módulo.

Usando el __name__ de un módulo

 #!/usr/bin/python # Filename: using_name.py if __name__ == '__main__': print 'This program is being run by itself' else: print 'I am being imported from another module' 

Salida –

 $ python using_name.py This program is being run by itself $ python >>> import using_name I am being imported from another module >>> 

Cómo funciona –

Cada módulo de Python tiene su __name__ definido y, si se trata de __main__ , implica que el usuario está ejecutando el módulo de forma independiente y podemos realizar las acciones correspondientes correspondientes.

Python no tiene un punto de entrada definido como Java, C, C ++, etc. Más bien, simplemente ejecuta un archivo fuente línea por línea. La instrucción if permite crear una función main que se ejecutará si su archivo se carga como módulo “Principal” en lugar de como una biblioteca en otro módulo.

Para que quede claro, esto significa que el intérprete de Python comienza en la primera línea de un archivo y lo ejecuta. La ejecución de líneas como la class Foobar: y def foobar() crea una clase o una función y las almacena en la memoria para su uso posterior.

Si importa el archivo de módulo (.py) que está creando ahora desde otro script de Python, no ejecutará el código dentro de

 if __name__ == '__main__': ... 

Si ejecuta el script directamente desde la consola, se ejecutará.

Python no usa o requiere una función main (). Cualquier código que no esté protegido por esa protección se ejecutará al ejecutar o importar el módulo.

Esto se amplía un poco más en python.berkely.edu