2010-06-06 12 views
19

Soy nuevo en Python así que por favor no me flamear si la pregunta es demasiado básico :)orden de ejecución y el estilo de codificación en Python

He leído que Python se ejecuta desde arriba - a - parte inferior.

Si este es el caso, ¿por qué programas van así:

def func2(): 
    pass 

def func1(): 
    func2() 

def func(): 
    func1() 

if __name__ == '__main__': 
    func() 

Así que por lo que he visto, la función principal va al pasado y las demás funciones que se apilan en la parte superior de la misma.

¿Me equivoco al decir esto? Si no, ¿por qué no está escrita la función principal o las definiciones de funciones de arriba hacia abajo?

EDIT: Estoy pidiendo por la que no puede hacer esto:

if __name__ == '__main__': 
    func() 

def func1(): 
    func2() 

No es éste el orden natural? Continúa agregando cosas en la parte inferior, ya que se ejecuta de arriba hacia abajo.

+0

Esto no tiene nada que ver con la ejecución fuera de servicio. Consulte http://en.wikipedia.org/wiki/Out-of-order_execution –

Respuesta

22

El def s acaba de crear las funciones. No se ejecuta ningún código, excepto analizar las funciones de sintaxis y vincular esos nombres.

El if es el primer código de lugar que se ejecuta realmente. Si lo pones primero y llamas a una función antes de que se defina, el resultado es un NameError. Por lo tanto, debe colocarlo después de definir las funciones.

Tenga en cuenta que esto es diferente a PHP o JavaScript, donde las funciones se 'alzan' - cualquier definición de función se procesa y analiza antes que cualquier otra cosa. En PHP y JavaScript, es perfectamente legal hacer lo que usted dice y definir funciones en la fuente más abajo de donde se les llama. (Un detalle en JS es que las funciones definidas como function(){} son izadas, mientras que las funciones definidas como var func1=function(){}; no lo son. Aún no sé cómo funciona con funciones anónimas en PHP 5.3).

Ver, en esto, cat() se imprimirá correctamente, y yip() le dará un NameError porque el analizador no ha llegado a la definición de yip() en el momento en que lo llama.

def cat(): 
    print 'meowin, yo' 

cat() 

yip() 

def yip(): 
    print 'barkin, yall' 

meowin, yo
Traceback (most recent call last):
File "cat.py", line 5, in
yip()
NameError: name 'yip' is not defined

0

def declaraciones simplemente definen una función: en realidad no se ejecutan hasta que se invoca la función. Por lo tanto, por qué generalmente aparecen antes de que el código los use, configuran la función para usarla en el futuro.

No hay un requisito duro que def declaraciones llegan antes que nada, es sólo bastante común para poner el código __main__ en la parte inferior (entre otras cosas, que deja claro lo que hay en esa sección y lo que no lo es, ya que cualquier cosa por debajo el if es parte de esa sección). También se asegura de que lo que sea que desee llamar desde la sección ya haya sido def 'd.

0

Es cierto que la convención es poner la función "principal" justo encima de la declaración "if __name__ == '__main__'" al final del archivo. Creo que esto se debe a que generalmente queremos que las funciones estén cerca de sus sitios de llamadas.

En cuanto a la función llamada que viene por encima de la función de llamada, creo que esto es solo el resultado de la refactorización. Al menos en mi caso, tiendo a escribir una función, y luego saco pedacitos de código para poner en subfunciones, que pongo en la parte superior para que pueda ver mejor.

Esto es solo una forma primitiva de organización de código. Si hay una unidad cohesiva más fuerte, estaría tentado de incluir esas funciones en su propio módulo.

1

La parte if __name__ == "__main__" va al final, porque presumiblemente cualquiera que sea su función principal necesitará todas las demás definiciones en el script. Si hubiera otras definiciones de función debajo de en el bloque principal, entonces no sería posible su uso allí, ya que no han sido vistas por el intérprete en ese punto.

+2

Puede invocar func1 desde func2, siempre que func1 haya sido _defined_ cuando se llame _ a func2. – Weeble

+0

Observado, eliminado. – detly

17

Python se ejecuta desde arriba hacia abajo, pero la ejecución de un bloque "def" no ejecuta inmediatamente el código contenido. En cambio, crea un objeto de función con el nombre dado en el alcance actual. Considere un archivo de Python al igual que su ejemplo:

def func2(): 
    print "func2" 

def func1(): 
    func2() 

def func(): 
    func1() 

if __name__ == '__main__': 
    func() 

Lo que sucede cuando este script se ejecuta es el siguiente:

En primer lugar, se crea un objeto de función y ligada al nombre de "func2" en el ámbito global .A continuación, se crea un objeto de función y se lo vincula con el nombre "func1" en el ámbito global. Luego uno llamado "func". Luego se ejecuta la instrucción "if", la condición es verdadera y se ejecuta la instrucción "func()". En este punto, "func" es un objeto de función que se encuentra en el ámbito global, por lo que se invoca y se ejecuta su código. Ese código contiene la instrucción "func1()", que se resuelve en una llamada a la función "func1", y así sucesivamente.

Si coloca la instrucción "if" en la parte superior, entonces cuando se ejecute aún no habría nada definido con el nombre "func", por lo que obtendría un error. Lo importante de reconocer es que la declaración "def" es en sí misma una declaración que se ejecuta. No es como en otros idiomas donde las definiciones son un tipo de declaración separada sin orden de ejecución.

También tenga en cuenta que siempre que el bit "if __name__ ..." esté al final del archivo, en realidad no importa en qué orden están las demás declaraciones, ya que para cuando se llaman todas de la "def" ya se habrá ejecutado.

+0

Este orden es muy común en C, donde una función debe declararse antes de su uso, incluso en otra definición de función. La gente usa la orden para evitar la necesidad de declaraciones futuras. No pensé que eso fuera necesario en Python, pero aún lo hago por costumbre. – phkahler

+0

¿Por qué ** si __name__ == '__main __': ** es cierto? Por favor explique. Yo voté! –

+1

@YanKhonski Ver https://stackoverflow.com/questions/419163/what-does-if-name-main-do – Weeble

3

Python, en general, procesa los comandos de arriba hacia abajo. Sin embargo, una llamada a función hará que Python ejecute esa función, y continuará hacia abajo solo después de que esa llamada haya finalizado.

En su ejemplo, el intérprete de Python ejecuta los siguientes pasos:

  1. Definir func2.
  2. Defina func1.
  3. Defina func.
  4. Proceso si la instrucción if __name__ == '__main__':.
  5. Llame a la función func (ya que la condición es verdadera).
  6. Llame a la función func1 (porque eso es lo que hace func).
  7. Llame a la función func2 (porque eso es lo que func1 hace).
  8. Fin, porque después de finalizar la llamada a func2 también ha terminado de llamar al func1 y, por lo tanto, ha terminado de llamar al func, que era la última declaración en el código.
0

Para la segunda parte de su pregunta (estilo de codificación en Python), me gustaría echar un vistazo a PEP 8, que proporciona una guía de estilo escrito por Guido van Rossum (el propio BFDL!) Y proporciona los conceptos básicos para escribir código Pythonic.

Cuestiones relacionadas