¿Qué significa "SyntaxError: paréntesis faltantes en la llamada a 'imprimir'" en Python?

389

Cuando trato de usar una printdeclaración en Python, me da este error:

>>> print "Hello, World!"
  File "<stdin>", line 1
    print "Hello, World!"
                        ^
SyntaxError: Missing parentheses in call to 'print'

Qué significa eso?

ncoghlan
fuente

Respuestas:

601

Este mensaje de error significa que está intentando usar Python 3 para seguir un ejemplo o ejecutar un programa que usa la printinstrucción Python 2 :

print "Hello, World!"

La declaración anterior no funciona en Python 3. En Python 3 necesita agregar paréntesis alrededor del valor a imprimir:

print("Hello, World!")

"SyntaxError: paréntesis faltantes en la llamada a 'imprimir'" es un nuevo mensaje de error que se agregó en Python 3.4.2 principalmente para ayudar a los usuarios que intentan seguir un tutorial de Python 2 mientras ejecutan Python 3.

En Python 3, los valores de impresión cambiaron de ser una declaración distinta a ser una llamada de función ordinaria, por lo que ahora necesita paréntesis:

>>> print("Hello, World!")
Hello, World!

En versiones anteriores de Python 3, el intérprete solo informa un error de sintaxis genérico, sin proporcionar pistas útiles sobre lo que podría estar yendo mal:

>>> print "Hello, World!"
  File "<stdin>", line 1
    print "Hello, World!"
                        ^
SyntaxError: invalid syntax

En cuanto a por qué se print convirtió en una función ordinaria en Python 3, eso no se relacionaba con la forma básica de la declaración, sino con la forma en que hacía cosas más complicadas como imprimir varios elementos para stderr con un espacio final en lugar de terminar la línea.

En Python 2:

>>> import sys
>>> print >> sys.stderr, 1, 2, 3,; print >> sys.stderr, 4, 5, 6
1 2 3 4 5 6

En Python 3:

>>> import sys
>>> print(1, 2, 3, file=sys.stderr, end=" "); print(4, 5, 6, file=sys.stderr)
1 2 3 4 5 6

Comenzando con el lanzamiento de Python 3.6.3 en septiembre de 2017, algunos mensajes de error relacionados con la sintaxis de impresión Python 2.x se han actualizado para recomendar sus contrapartes de Python 3.x:

>>> print "Hello!"
  File "<stdin>", line 1
    print "Hello!"
                 ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Hello!")?

Dado que el caso de "Paréntesis faltantes en la llamada para imprimir" es un error de sintaxis en tiempo de compilación y, por lo tanto, tiene acceso al código fuente sin procesar, puede incluir el texto completo en el resto de la línea en el reemplazo sugerido. Sin embargo, actualmente no intenta resolver las citas apropiadas para colocar alrededor de esa expresión (eso no es imposible, solo lo suficientemente complicado como para que no se haya hecho).

El TypeErrorplanteado para el operador de turno derecho también se ha personalizado:

>>> print >> sys.stderr
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for >>: 'builtin_function_or_method' and '_io.TextIOWrapper'. Did you mean "print(<message>, file=<output_stream>)"?

Dado que este error se genera cuando se ejecuta el código, en lugar de cuando se compila, no tiene acceso al código fuente sin procesar y, por lo tanto, utiliza metavariables ( <message>y <output_stream>) en la expresión de reemplazo sugerida en lugar de lo que el usuario realmente escribió . A diferencia del caso de error de sintaxis, es sencillo colocar comillas alrededor de la expresión de Python en el mensaje de error de desplazamiento a la derecha personalizado.

ncoghlan
fuente
3
Mi agradecimiento a @ antti-haapala por agregar el resumen en la parte superior que responde directamente a la pregunta antes de continuar con la explicación más larga de los orígenes del mensaje de error :)
ncoghlan
También cambié la respuesta a la wiki de la comunidad, como la acumulación de manera constante más rep así que para este no se siente bien para mí (ver bugs.python.org/issue21669 para el fondo pregunta sobre cómo co-evolucionado el mensaje de error y la presente OS)
ncoghlan
44
¡Hola! Creo que esta herramienta puede ayudar a alguien docs.python.org/2/library/2to3.html
Jhonatas Kleinkauff
1
Agregue la línea de la futura función print_import en su archivo 2.7 para agregar nuevas líneas python 3 print () a su código. Por lo tanto, el código se vuelve compatible con 2.7+ y 3.0+
MasterControlProgram
¿Cómo fuerza al sistema a usar Python 2.7 vs 3? Quizás este sea un buen lugar para ello.
Praxiteles
25

Desafortunadamente, el viejo cómic xkcd ya no está completamente actualizado.

https://imgs.xkcd.com/comics/python.png

Desde Python 3.0 tienes que escribir:

print("Hello, World!")

Y alguien todavía tiene que escribir esa antigravitybiblioteca :(

cristiano
fuente
66
aunque hay antigravedad ... ¿has intentado importarlo? ;)
tyrion
18

Hay un cambio en la sintaxis de Python 2 a Python 3. En Python 2,

print "Hello, World!" 

funcionará pero en Python 3, use paréntesis como

print("Hello, World!")

Esta es una sintaxis equivalente a Scala y cercana a Java.

Sagar balai
fuente
4

Si su código debe funcionar tanto en Python 2 como en 3, puede lograr esto cargando esto al comienzo de su programa:

from __future__ import print_function   # If code has to work in Python 2 and 3!

Luego puede imprimir de la manera Python 3:

print("python")

Si desea imprimir algo sin crear una nueva línea, puede hacer esto:

for number in range(0, 10):
    print(number, end=', ')
Lukasz
fuente
No funcionó para mí en Python3 incluso con esa importación. El código es sin paréntesis.
logicbloke
3

En Python 3, solo puede imprimir como:

print("STRING")

Pero en Python 2, los paréntesis no son necesarios.

Larry
fuente
3

Básicamente, desde Python 3.x necesita usar printcon paréntesis.

Python 2.x : imprime "El señor de los anillos"

Python 3.x : print ("El señor de los anillos")


Explicación

printEra una declaración en 2.x , pero es una función en 3.x . Ahora, hay una serie de buenas razones para esto.

  1. Con el formato de función de Python 3.x, se obtiene una mayor flexibilidad al imprimir varios elementos con un comando separado.
  2. No puede usar argumentos salpicados con una declaración. En 3.x si tiene una lista de elementos que desea imprimir con un separador, puede hacer esto:
>>> items = ['foo', 'bar', 'baz']
>>> print(*items, sep='+') 
foo+bar+baz
  1. No puede anular una declaración. Si desea cambiar el comportamiento de la impresión, puede hacerlo cuando es una función pero no cuando es una declaración.
Om Sao
fuente
2

También podría agregar que sabía todo sobre el cambio de sintaxis entre Python2.7y Python3, y mi código se escribió correctamente como print("string")e incluso print(f"string")...

Pero después de algún tiempo de depuración me di cuenta de que mi script bash estaba llamando a Python como:

python nombre_archivo.py

que tuvo el efecto de llamar a mi script de python de forma predeterminada usando el python2.7que dio el error. Entonces cambié mi script bash a:

python3 nombre_archivo.py

cuál de los gruesos usa python3 para ejecutar el script que solucionó el error.

Alfa Bravo
fuente
También puede agregar un shebang en la parte superior del archivo para indicar con qué Python cargar el archivo
OneCricketeer
Esa es una buena idea, sí!
Alfa Bravo
1

Fuera de las respuestas directas aquí, uno debe notar la otra diferencia clave entre python 2 y 3. El wiki oficial de python aborda casi todas las principales diferencias y se centra en cuándo debe usar cualquiera de las versiones. Esta publicación de blog también hace un buen trabajo al explicar el universo actual de Python y el rompecabezas de alguna manera sin resolver de pasar a Python 3.

Por lo que puedo decir, estás empezando a aprender el lenguaje python. Debe considerar los artículos antes mencionados antes de continuar por la ruta de Python 3. No solo tendrá que cambiar parte de su sintaxis, también deberá pensar qué paquetes estarán disponibles para usted (una ventaja de python 2) y las posibles optimizaciones que podrían realizarse en su código (una ventaja de python 3) .

Chad Van De Hey
fuente