O que significa “SyntaxError: parênteses ausentes na chamada para 'imprimir'” significa em Python?

389

Quando tento usar uma printinstrução em Python, ele me dá este erro:

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

O que isso significa?

ncoghlan
fonte

Respostas:

601

Essa mensagem de erro significa que você está tentando usar o Python 3 para seguir um exemplo ou executar um programa que usa a printinstrução Python 2 :

print "Hello, World!"

A declaração acima não funciona no Python 3. No Python 3, você precisa adicionar parênteses ao redor do valor a ser impresso:

print("Hello, World!")

“SyntaxError: parênteses ausentes na chamada para 'imprimir'” é uma nova mensagem de erro que foi adicionada no Python 3.4.2 principalmente para ajudar os usuários que estão tentando seguir um tutorial do Python 2 enquanto executam o Python 3.

No Python 3, os valores de impressão mudaram de uma declaração distinta para uma chamada de função comum; portanto, agora é necessário parênteses:

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

Nas versões anteriores do Python 3, o intérprete apenas relata um erro de sintaxe genérico, sem fornecer dicas úteis sobre o que pode estar errado:

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

Quanto ao motivo pelo qualprint se tornou uma função comum no Python 3, isso não estava relacionado à forma básica da declaração, mas à maneira como você fazia coisas mais complicadas, como imprimir vários itens em stderr com um espaço à direita, em vez de terminar a linha.

No Python 2:

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

No 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

A partir da versão 3.6.3 do Python em setembro de 2017, algumas mensagens de erro relacionadas à sintaxe de impressão do Python 2.x foram atualizadas para recomendar seus equivalentes do Python 3.x:

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

Como o caso "Parênteses ausentes na chamada para impressão" é um erro de sintaxe em tempo de compilação e, portanto, tem acesso ao código-fonte bruto, ele pode incluir o texto completo no restante da linha na substituição sugerida. No entanto, no momento, ele não tenta encontrar as aspas apropriadas para colocar em torno dessa expressão (isso não é impossível, apenas suficientemente complicado para que isso não tenha sido feito).

O TypeErroraumento para o operador de turno certo também foi 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>)"?

Como esse erro é gerado quando o código é executado, e não quando é compilado, ele não tem acesso ao código-fonte bruto e, portanto, usa meta-variáveis ​​( <message>e <output_stream>) na expressão de substituição sugerida, em vez do que o usuário realmente digitou . Diferentemente do caso de erro de sintaxe, é simples colocar aspas em torno da expressão Python na mensagem de erro de deslocamento à direita personalizada.

ncoghlan
fonte
3
Meus agradecimentos a @ antti-Haapala para adicionar o resumo na parte superior que diretamente responde à pergunta antes de seguir para o mais explicação sobre as origens da mensagem de erro :)
ncoghlan
Também mudei a resposta para o wiki da comunidade, pois acumular constantemente mais representantes de SO para isso não parece certo para mim (consulte bugs.python.org/issue21669 para obter o plano de fundo de como a mensagem de erro e essa pergunta de SO co-evoluíram)
ncoghlan 13/05
4
Olá! Eu acho que esta ferramenta pode ajudar alguém docs.python.org/2/library/2to3.html
Jhonatas Kleinkauff
11
Adicione a linha da futura importação print_function no seu arquivo 2.7 para adicionar novas linhas python 3 print () ao seu código. Daí o código torna-se compatível com 2.7+ e 3.0+
MasterControlProgram
Como você força o sistema a usar o Python 2.7 vs 3? Talvez este seja um bom lugar para isso.
precisa
25

Infelizmente, o antigo quadrinho xkcd não está mais atualizado.

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

Desde o Python 3.0, você precisa escrever:

print("Hello, World!")

E alguém ainda precisa escrever essa antigravitybiblioteca :(

cristão
fonte
6
existe antigravidade ... você já tentou importá-lo? ;)
tyrion
Ovo de Páscoa
AntiGravity
18

Há uma alteração na sintaxe de Python 2 para Python 3. No Python 2,

print "Hello, World!" 

funcionará, mas no Python 3, use parênteses como

print("Hello, World!")

Isso é uma sintaxe equivalente ao Scala e próximo ao Java.

Sagar balai
fonte
4

Se seu código funcionar em Python 2 e 3, você poderá conseguir isso carregando isso no início do seu programa:

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

Então você pode imprimir da maneira Python 3:

print("python")

Se você quiser imprimir algo sem criar uma nova linha - faça o seguinte:

for number in range(0, 10):
    print(number, end=', ')
Lukasz
fonte
Não funcionou para mim no Python3, mesmo com essa importação. O código está sem parênteses.
logicbloke 4/03
3

No Python 3, você só pode imprimir como:

print("STRING")

Mas no Python 2, os parênteses não são necessários.

Larry
fonte
3

Basicamente, desde o Python 3.x você precisa usar printparênteses.

Python 2.x : impressão "O Senhor dos Anéis"

Python 3.x : print ("O Senhor dos Anéis")


Explicação

printfoi uma declaração em 2.x , mas é uma função em 3.x . Agora, existem várias boas razões para isso.

  1. Com o formato de função do Python 3.x, há mais flexibilidade ao imprimir vários itens com o comman separado.
  2. Você não pode usar argumentos espalhados por uma declaração. Na 3.x, se você tiver uma lista de itens que deseja imprimir com um separador, poderá fazer o seguinte:
>>> items = ['foo', 'bar', 'baz']
>>> print(*items, sep='+') 
foo+bar+baz
  1. Você não pode substituir uma declaração. Se você deseja alterar o comportamento da impressão, é possível fazer isso quando é uma função, mas não quando é uma declaração.
Om Sao
fonte
2

Eu também poderia acrescentar que sabia tudo sobre a mudança de sintaxe entre Python2.7e Python3, e meu código foi escrito corretamente como print("string")e até print(f"string")...

Mas, após algum tempo de depuração, percebi que meu script bash estava chamando python como:

python file_name.py

que teve o efeito de chamar meu script python por padrão usando o python2.7qual deu o erro. Então mudei meu script bash para:

python3 file_name.py

qual dos grossos usa python3 para executar o script que corrigiu o erro.

Alfa Bravo
fonte
Você também pode adicionar um shebang na parte superior do arquivo para indicar com qual Python carregar o arquivo
OneCricketeer
Essa é uma boa ideia, sim!
Alfa Bravo
1

Fora das respostas diretas aqui, deve-se observar a outra diferença principal entre python 2 e 3. O wiki oficial do python aborda quase todas as principais diferenças e se concentra em quando você deve usar uma das versões. Esta postagem no blog também explica muito bem o universo atual do python e o quebra-cabeça de alguma maneira não resolvido da migração para o python 3.

Até onde eu sei, você está começando a aprender a linguagem python. Você deve considerar os artigos mencionados antes de continuar na rota python 3. Você não apenas precisará alterar parte de sua sintaxe, mas também precisará pensar sobre quais pacotes estarão disponíveis para você (uma vantagem do python 2) e possíveis otimizações que poderiam ser feitas no seu código (uma vantagem do python 3) .

Chad Van De Hey
fonte