Declarar la función al final del archivo en Python


94

¿Es posible llamar a una función sin primero definirla completamente? Al intentar esto, aparece el error: " function_name no está definido". Vengo de una experiencia en C ++, por lo que este problema me desconcierta.

Declarar la función antes de las obras:

def Kerma():
        return "energy / mass"    

print Kerma()

Sin embargo, intentar llamar a la función sin definirla primero da problemas:

print Kerma()

def Kerma():
    return "energy / mass"

En C ++, puede declarar una función después de la llamada una vez que coloca su encabezado antes.

¿Me estoy perdiendo de algo?


5
En Python no hay "declarar". Ahí está la definición (que debe estar completa) o no hay nada.
S.Lott

2
Dices, "da problemas". Puedes profundizar sobre eso?
Martin Del Vecchio

Posible duplicado de las funciones
usuario

En caso de que alguien se esté preguntando:Kerma is an acronym for "kinetic energy released per unit mass"
anon

1
Sé que esto es muy antiguo, pero ¿por qué nadie ha recomendado poner las funciones en un .pyarchivo separado e importarlo? ¿Hay algunas consecuencias no deseadas?
Kyle

Respuestas:


145

Una forma que es un poco idiomática en Python es escribir:

def main():
    print Kerma()

def Kerma():
    return "energy / mass"    

if __name__ == '__main__':
    main()

Esto le permite escribir su código en el orden que desee siempre que siga llamando a la función mainal final.


4
@Muhammad: si bien este es un enfoque viable, seguramente no es idiomático en Python. Al contrario, notará que la mayoría de las mainfunciones generalmente se colocan al final.
Eli Bendersky

15
@Eli Bendersky: Diría que el if __name__ == '__main__':cambio es la parte idiomática común.
S.Lott

2
@Eli: la parte idiomática es la cláusula if al final: no hay código en el nivel superior del módulo, luego al final invoca una función principal si el módulo es principal .
Ned Batchelder

1
@Eli: La parte idiomática es if ... __main__':. No dije que maindebería colocarse por encima del resto del código. Dije que lo importante es llamar _\_main__al final, y no importa dónde coloques su definición en ese momento.
Muhammad Alkarouri

2
Con el if name == ' main ': switch se vuelve irrelevante cómo ordena sus funciones. Eso es lo correcto (TM) por hacer.
MKesper

18

Cuando se ejecuta un módulo de Python (archivo .py), las declaraciones de nivel superior en él se ejecutan en el orden en que aparecen, de arriba a abajo (de principio a fin). Esto significa que no puede hacer referencia a algo hasta que lo haya definido. Por ejemplo, lo siguiente generará el error que se muestra:

c = a + b  # -> NameError: name 'a' is not defined
a = 13
b = 17

A diferencia de muchos otros idiomas, defy classlas declaraciones son ejecutables en Python, no sólo declarativa, de modo que no se puede hacer referencia a cualquiera ao bhasta que eso ocurra, y que están definidos. Esta es la razón por la que su primer ejemplo tiene problemas: está haciendo referencia a la Kerma()función antes de defque se haya ejecutado su declaración y el cuerpo se haya procesado y el objeto de función resultante esté vinculado al nombre de la función, por lo que no está definido en ese punto del script.

Los programas en lenguajes como C ++ generalmente se preprocesan antes de ejecutarse y durante esta etapa de compilación, todo el programa y los #includearchivos a los que hace referencia se leen y procesan de una vez. A diferencia de Python, este lenguaje presenta declaraciones declarativas que permiten declarar (pero no definir) el nombre y la secuencia de llamada de las funciones (o el tipo estático de variables), antes de su uso para que cuando el compilador encuentre su nombre, tenga suficiente información para verificar uso, que principalmente implica la verificación de tipos y conversiones de tipos, ninguno de los cuales requiere que se hayan definido aún sus contenidos reales o cuerpos de código.


No es que un lenguaje dinámico no pueda hacer eso. Perl es un lenguaje dinámico y puede llamar a una función antes de definirla. Eso es porque tiene una fase de compilación y una fase de ejecución (aunque de manera extraña, pero útil, puede organizar la ejecución de código durante la fase de compilación). Esto funciona: doit(); sub doit { print("I'm doing it!\n"); }
John Deighan

9

Esto no es posible en Python, pero francamente pronto descubrirá que no lo necesita en absoluto. La forma Pythonic de escribir código es dividir su programa en módulos que definen clases y funciones, y un único "módulo principal" que importa todos los demás y se ejecuta.

Para scripts simples y desechables, acostúmbrese a colocar la "porción ejecutable" al final, o mejor aún, aprenda a usar un shell interactivo de Python.


1

Python es un lenguaje dinámico y el intérprete siempre toma el estado de las variables (funciones, ...) como están en el momento de llamarlas. Incluso podría redefinir las funciones en algunos bloques if y llamarlos cada vez de forma diferente. Por eso tienes que definirlos antes de llamarlos.


1

Si está dispuesto a ser como C ++ y usar todo dentro de funciones. puede llamar a la primera función desde la parte inferior del archivo, así:

def main():
    print("I'm in main")
    #calling a although it is in the bottom
    a()

def b():
   print("I'm in b")

def a():
   print("I'm in a")
   b()

main()

De esa manera, Python primero 'lee' todo el archivo y luego comienza la ejecución

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.