Co oznacza "SyntaxError: Missing parentheses in call to 'print' " w Pythonie?

Kiedy próbuję użyć instrukcji print w Pythonie, pojawia się błąd:

>>> print "Hello, World!"
  File "<stdin>", line 1
    print "Hello, World!"
                        ^
SyntaxError: Missing parentheses in call to 'print'
Co to znaczy?
Author: Peter Mortensen, 2014-08-22

8 answers

Ten Komunikat o błędzie oznacza, że próbujesz użyć Pythona 3 do naśladowania przykładu lub uruchomić program, który używa instrukcji Pythona 2 print:

print "Hello, World!"

Powyższe stwierdzenie nie działa w Pythonie 3. W Pythonie 3 musisz dodać nawiasy wokół wartości, która ma być wydrukowana:

print("Hello, World!")

"SyntaxError: Missing nawiases in call to 'print' " {[26] } to nowy komunikat o błędzie, który został dodany w Pythonie 3.4.2 przede wszystkim w celu pomocy użytkownicy, którzy próbują postępować zgodnie z samouczkiem Pythona 2 podczas uruchamiania Pythona 3.

W Pythonie 3, drukowanie wartości zmieniło się z odrębnego wyrażenia na zwykłe wywołanie funkcji, więc teraz potrzebuje nawiasów:

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

We wcześniejszych wersjach Pythona 3, interpreter po prostu zgłasza ogólny błąd składni, nie podając żadnych użytecznych wskazówek co do tego, co może pójść nie tak:

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

A co do dlaczego print stał się zwykłą funkcją w Pythonie 3, która nie odnoszą się do podstawowej formy instrukcji, ale raczej do tego, jak wykonywałeś bardziej skomplikowane rzeczy, takie jak drukowanie wielu elementów na stderr ze spacją końcową, a nie kończącą linię.

W Pythonie 2:

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

W Pythonie 3:

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

Począwszy od wydania Pythona 3.6.3 we wrześniu 2017 r., niektóre komunikaty o błędach związane z Pythonem 2.składnia x print została zaktualizowana, aby polecić ich Python 3.x:

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

Ponieważ " brak nawiasów w wywołaniu do druku" case jest błędem składni w czasie kompilacji i dlatego ma dostęp do surowego kodu źródłowego, jest w stanie dołączyć pełny tekst na pozostałej części linii w sugerowanym zastępstwie. Jednak obecnie nie próbuje wypracować odpowiednich cudzysłowów, aby umieścić wokół tego wyrażenia(nie jest to niemożliwe, po prostu na tyle skomplikowane, że nie zostało to zrobione).

TypeError podniesiony dla właściwego operatora zmiany został również dostosowany:

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

Ponieważ ten błąd jest wywołany, gdy kod jest uruchamiany, a nie gdy jest kompilowany, nie ma dostępu do surowego kodu źródłowego i dlatego używa meta-zmiennych (<message> i <output_stream>) w sugerowanym wyrażeniu zastępczym zamiast tego, co użytkownik faktycznie wpisał. W przeciwieństwie do przypadku błędu składni, proste jest umieszczanie cudzysłowów wokół wyrażenia Pythona w niestandardowym komunikacie o błędzie przesunięcia w prawo.

 614
Author: ncoghlan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-05 16:31:12

Niestety, Stary komiks xkcd nie jest już do końca aktualny.

/images/content/51612933 / bcc0b85f5cedb72a4c15ae8efbe17f63.png

Od Pythona 3.0 musisz napisać:

print("Hello, World!")

A ktoś musi jeszcze napisać, żeantigravity biblioteka: (

 26
Author: Christian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-05 16:38:11

Nastąpiła zmiana składni z Pythona 2 na Pythona 3. W Pythonie 2,

print "Hello, World!" 

Będzie działać, ale w Pythonie 3 Użyj nawiasów jako

print("Hello, World!")

Jest to składnia równoważna Scali i near Java.

 21
Author: Sagar balai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-13 15:05:42

Zasadniczo, od Pythona 3.x musisz użyć print z nawiasem.

Python 2.x: print "Władca Pierścieni"

Python 3.x : print ("Władca Pierścieni")


Explaination

print było stwierdzeniem w 2.x, ale jest to Funkcja w 3.x . Istnieje wiele dobrych powodów.

  1. z formatem funkcji Pythona 3.x, większa elastyczność przy drukowaniu wielu elementy z przecinkami.
  2. nie można używać splattingu argumentów z instrukcją. W 3.x Jeśli masz listę elementów, które chcesz wydrukować za pomocą separatora, możesz to zrobić:
>>> items = ['foo', 'bar', 'baz']
>>> print(*items, sep='+') 
foo+bar+baz
  1. nie możesz unieważnić Oświadczenia. Jeśli chcesz zmienić zachowanie print, możesz to zrobić, gdy jest to funkcja, ale nie, gdy jest to Instrukcja.
 6
Author: Om Sao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-22 20:01:11

Jeśli Twój kod powinien działać zarówno w Pythonie 2 jak i 3, możesz to osiągnąć, ładując go na początku programu:

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

Następnie możesz wydrukować w Pythonie 3:

print("python")

Jeśli chcesz wydrukować coś bez tworzenia nowej linii-możesz to zrobić:

for number in range(0, 10):
    print(number, end=', ')
 5
Author: Lukasz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-05 16:22:27

W Pythonie 3 możesz drukować tylko jako:

print("STRING")

Ale w Pythonie 2 nawiasy nie są konieczne.

 3
Author: Larry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-05 16:35:58

Dodam jeszcze, że wiedziałem wszystko o zmianie składni między Python2.7 a Python3, A mój kod został poprawnie napisany jako print("string") i nawet print(f"string")...

Ale po pewnym czasie debugowania zdałem sobie sprawę, że mój skrypt bash nazywa Pythona tak:

Python file_name.py

, który wywołał mój skrypt Pythona domyślnie używając python2.7, który podał błąd. Więc zmieniłem skrypt Basha na:

Python3 file_name.py

Który z coarse używa python3 do uruchomienia skryptu, który naprawił błąd.

 3
Author: Alfa Bravo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-02 13:56:24

Poza bezpośrednimi odpowiedziami tutaj, należy zwrócić uwagę na inną kluczową różnicę między Pythonem 2 i 3. Oficjalna wiki Pythona omawia prawie wszystkie główne różnice i skupia się na tym, kiedy powinieneś użyć którejś z wersji. ten post na blogu również dobrze wyjaśnia obecny wszechświat Pythona i jakoś nierozwiązaną zagadkę przejścia do Pythona 3.

Z tego co wiem, zaczynasz uczyć się języka python. Należy wziąć pod uwagę wyżej wymienione artykuły przed kontynuacją trasy python 3. Nie tylko będziesz musiał zmienić część składni, ale także zastanów się, które pakiety będą dostępne dla Ciebie (zaleta Pythona 2) i potencjalne optymalizacje, które mogą być wprowadzone w Twoim kodzie (zaleta Pythona 3).

 1
Author: Chad Van De Hey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-05 16:39:36