2009-04-16 12 views
31

Utilizo Python CGI. No puedo llamar a una función antes de que esté definida.Definición de función en una orden de archivo python independiente

En Oracle PL/SQL existía este truco de "declaración directa": nombrar todas las funciones en la parte superior para que el orden de definición no importe.

¿Hay un truco así en Python?

ejemplo:

def do_something(ds_parameter): 
    helper_function(ds_parameter) 
    .... 

def helper_function(hf_parameter): 
    .... 

def main(): 
    do_something(my_value) 

main() 

David tiene razón, mi ejemplo es erróneo. ¿Qué hay de :

<start of cgi-script> 

def do_something(ds_parameter): 
    helper_function(ds_parameter) 
    .... 

def print_something(): 
    do_something(my_value) 

print_something() 

def helper_function(hf_parameter): 
    .... 

def main() 
    .... 

main() 

¿Puedo declarar "hacia adelante" las funciones en la parte superior de la secuencia de comandos?

+0

Dado que el código de ejemplo funcionará, y es independiente de la orden, no entiendo la pregunta. –

+0

Posible duplicado de [declarar la función al final del archivo en Python] (http://stackoverflow.com/questions/3754240/declare-function-at-end-of-file-in-python) – user

Respuesta

45

Todas las funciones se deben definir antes de utilizarlas.

Sin embargo, las funciones se pueden definir en cualquier orden, siempre y cuando todas estén definidas antes de que cualquier código ejecutable utilice una función.

No necesita "enviar declaración" porque todas las declaraciones son completamente independientes entre sí. Siempre que todas las declaraciones lleguen antes que todo código ejecutable.

¿Estás teniendo un problema? Si es así, publique el código que no funciona.


En su ejemplo, print_something() está fuera de lugar.

La regla: Todas las funciones deben ser definidos antes de cualquier código que hace el verdadero trabajo

Por lo tanto, poner todas las declaraciones que trabajan última.

+1

Esto es cierto en Python 3 o solo Python <= 2? –

+0

Creo que los parámetros predeterminados de una declaración de función requieren una declaración directa, p. Ej. 'def f (x = g()): .. def g(): ..' no compilará aunque no se use en el momento de la declaración. – mnish

+1

@mnish Es cierto, lo que ilustra bien que los ** parámetros predeterminados se evalúan en tiempo de compilación **, que a menudo no es lo que se pretende. Use 'f (x = None): ...' y 'si x es None: x = g()' en su lugar. – j08lue

2

Suponiendo que tiene algún fragmento de código que llama a su función principal después de haber sido definida, entonces su ejemplo funciona como está escrito. Debido a la forma en que se interpreta Python, no es necesario definir las funciones que el cuerpo de do_something llama cuando se define la función do_something.

Los pasos que dará Python al ejecutar su código son los siguientes.

  1. Define la función do_something.
  2. Define la función helper_function.
  3. Define la función main.
  4. (Dado mi supuesto anterior) Llame al principal.
  5. Desde main, llame a do_something.
  6. Desde do_something, llame a helper_function.

La única vez que Python le importa que helper_function exista es cuando llega al paso seis. Debería poder verificar que Python llega al paso seis antes de generar un error cuando intenta encontrar helper_function para que pueda llamarlo.

1

Nunca me he encontrado con un caso donde "forward-function-definition" es necesario .. ¿No puedes simplemente mover print_something() dentro de tu función principal ...?

def do_something(ds_parameter): 
    helper_function(ds_parameter) 
    .... 

def print_something(): 
    do_something(my_value) 


def helper_function(hf_parameter): 
    .... 

def main() 
    print_something() 
    .... 

main() 

Python no le importa que helper_function() se define hasta después de su uso en la línea 3 (en la función do_something)

recomiendo el uso de algo así como WinPDB y pasando a través de su código. Se muestra muy bien cómo funciona analizador/ejecutor de Python

16

Una mejor ilustración de su punto sería (?):

def main(): 
    print_something() 
    .... 

def do_something(ds_parameter): 
    helper_function(ds_parameter) 
    .... 

def print_something(): 
    do_something(my_value) 


def helper_function(hf_parameter): 
    .... 


main() 

En otras palabras, usted puede mantener su definición de main() en la parte superior, para la edición conveniencia - evitando el desplazamiento frecuente, si la mayor parte del tiempo se dedica a la edición principal.

+1

Es por eso que tiene tanto sentido separar las declaraciones y el código ejecutado por la barrera común 'if __name__ ==" __main __ ":'. – j08lue

0
def funB(d,c): 
    return funA(d,c) 

print funB(2,3) 

def funA(x,y): 
    return x+y 

El código anterior arrojará un error. Sin embargo, el siguiente código está bien ...

def funB(d,c): 
    return funA(d,c) 

def funA(x,y): 
    return x+y 

print funB(2,3) 

Así, a pesar de que definitivamente debe definir la función antes de cualquier trabajo real se realiza, es posible alejarse si no se utiliza la función de forma explícita. Creo que esto es algo similar a la creación de prototipos en otros idiomas ...

Cuestiones relacionadas