Що означає "SyntaxError: пропущені дужки при виклику до" print "" означає у Python?


389

Коли я намагаюся використовувати printоператор у Python, він видає мені цю помилку:

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

Що це означає?

Відповіді:


601

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

print "Hello, World!"

Викладений вище твердження не працює в Python 3. У Python 3 вам потрібно додати круглі дужки навколо значення, яке слід надрукувати:

print("Hello, World!")

«SyntaxError: відсутні дужки в виклику до« друку » - це нове повідомлення про помилку, яке було додано в 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 у користувальницькому повідомленні про помилку зсуву.


3
Дякую @ antti-haapala за те, що додав резюме вгорі, що безпосередньо відповідає на питання, перш ніж продовжувати тривале пояснення витоків повідомлення про помилку :)
ncoghlan,

Я також переключила відповідь на вікі спільноти, оскільки стабільно накопичуючи подальший реплікатор SO для цього мені не підходить (див. 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? Можливо, це хороше місце для цього.
Праксителес


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 навіть при цьому імпорті. Код без дужок.
logicbloke

3

У Python 3 ви можете друкувати лише як:

print("STRING")

Але в Python 2 дужки не потрібні.


3

В основному, оскільки Python 3.x потрібно використовувати printз дужками.

Python 2.x : надрукувати "Володар кілець"

Python 3.x : print ("Володар перснів")


Пояснення

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 3. Вам не тільки доведеться змінити частину свого синтаксису, також потрібно буде подумати про те, які пакунки будуть доступні вам (перевага python 2) та потенційні оптимізації, які можна зробити у вашому коді (перевага python 3) .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.