Что означает «SyntaxError: Отсутствие скобок в вызове« print »» в Python?

389

Когда я пытаюсь использовать printоператор в Python, он дает мне эту ошибку:

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

Что это обозначает?

ncoghlan
источник

Ответы:

601

Это сообщение об ошибке означает, что вы пытаетесь использовать Python 3, чтобы следовать примеру, или запустить программу, которая использует printоператор Python 2 :

print "Hello, World!"

Вышеупомянутое утверждение не работает в Python 3. В Python 3 необходимо добавить круглые скобки вокруг значения, которое будет напечатано:

print("Hello, World!")

«SyntaxError: Отсутствие скобок в вызове« print »» - это новое сообщение об ошибке, которое было добавлено в Python 3.4.2, главным образом, чтобы помочь пользователям, которые пытаются следовать учебному руководству по Python 2 при запуске Python 3.

В Python 3 значения печати изменились с того, что они стали отдельным оператором, и стали обычным вызовом функции, поэтому теперь нужны скобки:

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

В более ранних версиях Python 3 интерпретатор просто сообщал об общей синтаксической ошибке, не предоставляя каких-либо полезных советов относительно того, что может идти не так:

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

Что касается того, почему он print стал обычной функцией в Python 3, это не относилось к базовой форме оператора, а скорее к тому, как вы делали более сложные вещи, такие как печать нескольких элементов в stderr с конечным пробелом, а не с окончанием строки.

В Python 2:

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

В 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

Начиная с выпуска Python 3.6.3 в сентябре 2017 года, некоторые сообщения об ошибках, связанные с синтаксисом печати Python 2.x, были обновлены, чтобы рекомендовать их аналоги Python 3.x:

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

Поскольку случай «Отсутствие скобок в вызове для печати» является синтаксической ошибкой времени компиляции и, следовательно, имеет доступ к необработанному исходному коду, он может включить полный текст в оставшуюся часть строки в предложенную замену. Однако в настоящее время он не пытается выработать соответствующие кавычки для размещения вокруг этого выражения (это не невозможно, просто достаточно сложно, чтобы это не было сделано).

TypeErrorПоднятый для правильного оператора сдвига также изменен:

>>> 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>)"?

Поскольку эта ошибка возникает при выполнении кода, а не при его компиляции, он не имеет доступа к необработанному исходному коду и, следовательно, использует мета-переменные ( <message>и <output_stream>) в предложенном выражении замены вместо того, что пользователь фактически набрал. , В отличие от случая синтаксической ошибки, заключить в кавычки выражение Python в пользовательском сообщении об ошибке правого сдвига просто.

ncoghlan
источник
3
Моя благодарность @ antti-haapala за добавление сводки вверху, которая непосредственно отвечает на вопрос, прежде чем перейти к более
подробному
Я также включил ответ сообщества вики, так как постоянно накапливая дальше так респ для этого не чувствует себя хорошо ко мне (см bugs.python.org/issue21669 на фоне о том , как сообщение об ошибке , и это SO вопрос совместно эволюционировали)
ncoghlan
4
Здравствуйте! Я думаю, что этот инструмент может помочь кому-то docs.python.org/2/library/2to3.html
Jhonatas Kleinkauff
1
Добавьте строку из будущего импорта print_function в ваш файл 2.7, чтобы добавить новые строки python 3 print () в ваш код. Следовательно код становится совместимым с 2.7+ и 3.0+
MasterControlProgram,
Как заставить систему использовать Python 2.7 против 3? Возможно, это хорошее место для этого.
Пракситель
25

К сожалению, старый комикс xkcd больше не полностью обновлен.

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

Начиная с Python 3.0 вы должны написать:

print("Hello, World!")

И кто-то еще должен написать эту antigravityбиблиотеку :(

Кристиан
источник
6
хотя есть антигравитация ... вы пытались импортировать его? ;)
Тирион
18

Существует изменение в синтаксисе с Python 2 на Python 3. В Python 2

print "Hello, World!" 

будет работать, но в Python 3 используйте круглые скобки как

print("Hello, World!")

Это эквивалентный синтаксис для Scala и рядом с Java.

Сагар Балай
источник
4

Если ваш код должен работать как в Python 2, так и в 3, вы можете достичь этого, загрузив его в начале вашей программы:

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

Затем вы можете распечатать в Python 3 способом:

print("python")

Если вы хотите напечатать что-то без создания новой строки - вы можете сделать это:

for number in range(0, 10):
    print(number, end=', ')
Лукаш
источник
У меня не работал в Python3 даже с этим импортом. Код без скобок.
логика
3

В Python 3 вы можете печатать только как:

print("STRING")

Но в Python 2 скобки не обязательны.

Larry
источник
3

В основном, начиная с Python 3.x, вам нужно использовать printкруглые скобки.

Python 2.x : печать "Властелин колец"

Python 3.x : печать («Властелин колец»)


Explaination

printбыло заявление в 2.x , но это функция в 3.х . Теперь для этого есть ряд веских причин.

  1. С функциональным форматом Python 3.x больше гибкости достигается при печати нескольких элементов через запятую.
  2. Вы не можете использовать аргументы с утверждением. В 3.x, если у вас есть список элементов, которые вы хотите напечатать с разделителем, вы можете сделать это:
>>> items = ['foo', 'bar', 'baz']
>>> print(*items, sep='+') 
foo+bar+baz
  1. Вы не можете переопределить утверждение. Если вы хотите изменить поведение печати, вы можете сделать это, когда это функция, а не когда это оператор.
Ом Сао
источник
2

Я мог бы также просто добавить, что я знал все об изменении синтаксиса между Python2.7и Python3, и мой код был правильно написан как print("string")и даже print(f"string")...

Но после некоторого времени отладки я понял, что мой bash-скрипт вызывает python:

python file_name.py

который по умолчанию вызывал мой скрипт на python, используя python2.7который дал ошибку. Поэтому я изменил свой bash-скрипт на:

python3 file_name.py

который из грубо использует python3 для запуска скрипта, который исправил ошибку.

Альфа Браво
источник
Вы также можете добавить шебанг в начало файла, чтобы указать, с каким Python загружать файл
OneCricketeer
Это хорошая идея, да!
Альфа Браво
1

Помимо прямых ответов здесь, следует отметить другое ключевое отличие между python 2 и 3. Официальная вики по питону раскрывает почти все основные различия и фокусируется на том, когда вам следует использовать любую из версий. Этот пост также прекрасно объясняет текущую вселенную Python и неразрешимую загадку перехода на Python 3.

Насколько я могу судить, вы начинаете изучать язык Python. Вы должны рассмотреть вышеупомянутые статьи, прежде чем продолжить движение по маршруту Python 3. Вам нужно будет не только изменить часть своего синтаксиса, но и подумать о том, какие пакеты будут вам доступны (преимущество Python 2) и возможных оптимизациях, которые могут быть сделаны в вашем коде (преимущество Python 3). ,

Чад Ван Де Хей
источник