2010-09-20 10 views
53

¿Es posible invocar una función sin antes definirla completamente? Al intentar esto me sale el error: "function_name no está definido". Vengo de un fondo de C++, así que este problema me detiene.Función de declaración al final del archivo en Python

Declarar la función antes de las obras:

def Kerma(): 
     return "energy/mass"  

print Kerma() 

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

print Kerma() 

def Kerma(): 
    return "energy/mass" 

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

¿Falta algo aquí?

+3

En Python no hay "declarar". Está la definición (que debe estar completa) o no hay nada. –

+2

Usted dice: "da problemas". Puedes profundizar sobre eso? –

+0

Posible duplicado de [Funciones de declaración en Python después de una llamada] (http://stackoverflow.com/questions/17953219/declaration-functions-in-python-after-call) – user

Respuesta

93

Una manera en que es una especie de idiomática en Python está escribiendo:

def main(): 
    print Kerma() 

def Kerma(): 
    return "energy/mass"  

if __name__ == '__main__': 
    main() 

Esto le permite escribir código que en el orden que desee, siempre y cuando mantenga llamando a la función main al final.

+1

@Muhammad: si bien este es un enfoque viable, seguramente no es idiomático en Python. Por el contrario, notarás que la mayoría de las funciones 'principales' generalmente se colocan al final. –

+8

@Eli Bendersky: Yo diría que el interruptor 'if __name__ == '__main __':' es la parte idiomática común. –

+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 se invoca una función principal si el módulo es __main__. –

7

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 simples scripts desechables, acostúmbrese a colocar la "parte 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, ...) tal como están en el momento de llamarlas. Incluso podría redefinir las funciones en algunos bloques if y llamarlos cada vez de manera diferente. Es por eso que debes definirlos antes de llamarlos.

11

Cuando se ejecuta un módulo de Python (archivo .py), las instrucciones de nivel superior 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, la siguiente generará el error se muestra:

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

A diferencia de muchos otros idiomas, def y class declaraciones son ejecutables en Python — no sólo declarativa — por lo que puede no hacer referencia a cualquiera hasta que eso ocurra, y que están definido. Esta es la razón por la que su primer ejemplo tiene problemas con — al hacer referencia a la función Kerma() antes de que su sentencia def haya sido ejecutada y el cuerpo haya sido procesado y el objeto resultante vinculado al nombre de la función, por lo que no está definido en ese punto en la secuencia de comandos.

Los programas en idiomas como C++ generalmente se procesan antes de ejecutarse y durante esta etapa de compilación, todo el programa y todos los archivos #include a los que hace referencia se leen y procesan a la vez. A diferencia de Python, este lenguaje presenta declaraciones declarativas que permiten declarar el nombre y la secuencia de llamadas de funciones (o tipo estático de variables) antes de su uso, de modo que cuando el compilador encuentra su nombre tenga suficiente información para verificar su uso, que principalmente implica comprobación de tipos y conversiones de tipo, ninguno de los cuales requiere que sus contenidos reales o cuerpos de código hayan sido definidos todavía.

Cuestiones relacionadas