Error de syntax al definir una función en la línea de comandos de Python

Estoy tratando de definir una función en el REPL de Python. Cada vez que bash ejecutar el siguiente código, aparece un error de syntax.

Código:

def hello(): print ("Hello!") hello() 

Error:

 C:\Users\~\Desktop>python Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 16:07:46) [MSC v.1900 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> def hello(): ... print ("Hello!") ... hello() File "", line 3 hello() ^ SyntaxError: invalid syntax 

Error

Una posible explicación que he encontrado en stackoverflow es este error de Python: Archivo “” donde dice que no puedo ejecutar scripts desde el intérprete de Python. Si eso es cierto, ¿por qué es así? Es decir, si soy capaz de ejecutar >>> 2 + 2 en la ventana de cmd, ¿por qué no puedo ejecutar una función ‘def’? Con la esperanza de buscar una aclaración sobre este punto – ¡Gracias!

Editar: Ponga el error en el texto, no solo en la imagen.

Presione enter una vez después de definir su función (es decir, ingrese una línea en blanco ). Esencialmente, esto le permite a Python saber que ha terminado de definir su función.

Una vez que veas >>> nuevo, puedes llamar a tu función.

Vea la imagen para ver cómo debe verse cuando se hace correctamente:

introduzca la descripción de la imagen aquí

Si desea comprender por qué sucede esto, en lugar de simplemente aprender una solución que funcione por alguna razón misteriosa:

El modo interactivo funciona al leer, comstackr y ejecutar una statement a la vez. Esta es una regla simple y muerta, además de ser simple para implementarla en el código C, también es simple para trabajar exactamente en tu cabeza, una vez que lo entiendes. Cuando se le da una opción entre una implementación que es fácil de explicar, documentar y trabajar en su mente o una que es más complicada pero a veces más fácil de usar, Python usualmente va con la primera.


Si ingresa una instrucción simple de una línea, eso es fácil: la línea es una instrucción completa, por lo que simplemente comstack y ejecuta esa línea.

Pero si ingresa la primera línea de una instrucción compuesta, una que tiene un : en el final de la línea y luego un bloque con sangría, la statement no se realiza hasta que escriba un bloque con sangría y luego vuelva a desocupar. Por lo tanto, imprime ese aviso especial ... lugar de >>> para hacerle saber que sigue leyendo la misma statement, y continúa hasta que no se lo indique.

Si no va a escribir al escribir una línea en blanco, la statement se hace, así que la comstack y la ejecuta, y todo está bien.

Si no va a escribir al escribir una nueva statement de una sola línea, ahora tiene dos declaraciones. Si intenta comstackr y ejecutar eso como una sola statement, eso falla.

Por cierto, no hay nada mágico acerca de la def aquí; lo mismo ocurrirá con cualquier statement compuesta:

 >>> for i in range(10): ... print(i) ... print('Done') 

Obtendrá el mismo SyntaxError .


¿Python no pudo darse cuenta de que le diste dos instrucciones y comstackrlas y ejecutarlas una tras otra? Sí. De hecho, si usas IPython / Jupyter, en realidad hace exactamente eso. Pero esto haría la regla más complicada, por no mencionar cosas como el manejo de excepciones en la primera statement. Python elige la regla simple por la que puedes rastrear en tu cabeza la regla complicada aquí, aunque la regla complicada haría lo que quieras con más frecuencia.


Entonces, ¿cómo funciona esto en un archivo de módulo? Bueno, los módulos no se comstackn una statement a la vez, se comstackn todos a la vez, como una lista de declaraciones, y luego se ejecutan a la vez. Eso obviamente no funciona para el terminal interactivo, porque no puede ejecutar nada hasta que comstack todo, y no lo tiene todo hasta que sale el tiempo.


Una última cosa: ¿por qué funcionan las expresiones continuas?

 >>> (1 + ... 2) 3 

Las expresiones no se preocupan por la sangría. Terminan cuando todos los parens / brackets / corchetes están balanceados al final de una línea, no cuando la siguiente línea no tiene sangría. Entonces, tan pronto como ingresas ese 2) , sabe que la entrada está completa, y puede comstackrla.

Y lo mismo es cierto para la continuación de barra invertida:

 >>> 1 + \ ... 2 3 

No hay necesidad de una línea sin sangría; tan pronto como escribe ese 2 sin una continuación de barra invertida, la entrada está completa.

Debe agregar una nueva línea entre la función de definición y llamarla:

 def hello(): print ("Hello!") hello() 

Parece que has ingresado a todo el bloque como una sola statement. Tendrás que pulsar enter después de entrar:

 def hello(): print ("Hello!") 

Para que el intérprete entienda que esta es una definición única que ha ingresado. Una vez que se haya definido, intente ejecutar la función hello() .