Co oznacza „SyntaxError: brak nawiasów w wywołaniu„ print ”” w Pythonie?


389

Kiedy próbuję użyć printinstrukcji w Pythonie, pojawia się następujący błąd:

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

Co to znaczy?

Odpowiedzi:


601

Ten komunikat o błędzie oznacza, że ​​próbujesz użyć języka Python 3, aby pójść za przykładem lub uruchomić program korzystający z printinstrukcji języka Python 2 :

print "Hello, World!"

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

print("Hello, World!")

„Błąd składni: brak nawiasów w wywołaniu„ drukowania ”” to nowy komunikat o błędzie, który został dodany w Pythonie 3.4.2 przede wszystkim w celu ułatwienia użytkownikom, którzy próbują postępować zgodnie z samouczkiem w Pythonie 2 podczas uruchamiania Pythona 3.

W Pythonie 3 wartości drukowania zmieniły się z wyraźnego wyrażenia na zwykłe wywołanie funkcji, więc teraz potrzebują nawiasów:

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

We wcześniejszych wersjach Pythona 3 interpreter zgłaszał tylko ogólny błąd składniowy, nie podając użytecznych wskazówek, co może być nie tak:

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

Jeśli chodzi o tego, dlaczego print stało się zwykłą funkcją w Pythonie 3, nie dotyczyło to podstawowej formy instrukcji, ale raczej tego, w jaki sposób robiłeś bardziej skomplikowane rzeczy, takie jak drukowanie wielu elementów do stderr z końcową spacją zamiast kończenia wiersza.

W Python 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 wersji Python 3.6.3 we wrześniu 2017 r., Niektóre komunikaty o błędach związane ze składnią wydruku Python 2.x zostały zaktualizowane, aby polecać ich odpowiedniki w Python 3.x:

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

Ponieważ przypadek „Brakujących nawiasów w wywołaniu do drukowania” jest błędem składni czasu kompilacji, a zatem ma dostęp do surowego kodu źródłowego, może sugerować zastąpienie całego tekstu w pozostałej części wiersza. Jednak obecnie nie próbuje wypracować odpowiednich cudzysłowów, aby umieścić wokół tego wyrażenia (to nie jest niemożliwe, wystarczy na tyle skomplikowane, że nie zostało to zrobione).

TypeErrorPodniesiony po prawej operatora przesunięcia zostało również dostosowane:

>>> 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 pojawia się podczas uruchamiania kodu, a nie podczas kompilacji, nie ma on dostępu do surowego kodu źródłowego, a zatem używa meta-zmiennych ( <message>i <output_stream>) w sugerowanym wyrażeniu zastępującym zamiast tego, co użytkownik faktycznie wpisał . W odróżnieniu od przypadku błędu składniowego, łatwo jest umieścić cudzysłowy wokół wyrażenia Python w niestandardowym komunikacie o błędzie przesunięcia w prawo.


3
Moje podziękowania dla @ antti-haapala za dodanie podsumowania u góry, które bezpośrednio odpowiada na pytanie, zanim przejdę do dłuższego wyjaśnienia pochodzenia komunikatu o błędzie :)
ncoghlan

Zmieniłem również odpowiedź na wiki społeczności, ponieważ ciągłe gromadzenie kolejnych przedstawicieli SO nie jest dla mnie właściwe (zobacz bugs.python.org/issue21669, aby uzyskać informacje na temat tego, jak ewoluował komunikat o błędzie i to pytanie SO)
ncoghlan

4
Dzień dobry! Myślę, że to narzędzie może komuś pomóc docs.python.org/2/library/2to3.html
Jhonatas Kleinkauff

1
Dodaj wiersz z przyszłej funkcji print_funkcji w pliku 2.7, aby dodać nowe wiersze print () w języku Python 3 do swojego kodu. W związku z tym kod staje się kompatybilny z wersją 2.7+ i 3.0+
MasterControlProgram

Jak zmusić system do używania Python 2.7 vs 3? Być może jest to dobre miejsce na to.
Praxiteles,


18

Zmiana składni z Python 2 na Python 3. W Python 2

print "Hello, World!" 

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

print("Hello, World!")

Jest to odpowiednik składni Scali i zbliżony do Javy.


4

Jeśli Twój kod powinien działać zarówno w Pythonie 2, jak i 3, możesz to osiągnąć, ładując to 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 Python 3 sposób:

print("python")

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

for number in range(0, 10):
    print(number, end=', ')

Nie działało dla mnie w Python3 nawet przy tym imporcie. Kod nie zawiera nawiasów.
logicbloke

3

W Pythonie 3 możesz drukować tylko jako:

print("STRING")

Ale w Pythonie 2 nawiasy nie są konieczne.


3

Zasadniczo, ponieważ Python 3.x należy używać printz nawiasami.

Python 2.x : wydrukuj „Władca pierścieni”

Python 3.x : print („Władca pierścieni”)


Wyjaśnienie

printbyło stwierdzenie w 2.x , ale jest to funkcja w 3.x . Istnieje wiele dobrych powodów.

  1. Format formatu Python 3.x zapewnia większą elastyczność przy drukowaniu wielu elementów z separacją komend.
  2. Nie można używać rozpryskiwania argumentów z instrukcją. W wersji 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 przesłonić instrukcji. Jeśli chcesz zmienić zachowanie drukowania, możesz to zrobić, gdy jest to funkcja, ale nie, gdy jest to instrukcja.

2

Mógłbym również dodać, że wiedziałem wszystko o zmianie składni między Python2.7i Python3, a mój kod został poprawnie napisany jako print("string")a nawet print(f"string")...

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

python nazwa_pliku.py

co spowodowało domyślne wywołanie mojego skryptu python, python2.7który dał błąd. Więc zmieniłem skrypt bash na:

python3 nazwa_pliku.py

która z grubej używa Python3 do uruchomienia skryptu, który naprawił błąd.


Możesz także dodać shebang na górze pliku, aby określić, z którym Pythonem załadować plik
OneCricketeer

To dobry pomysł tak!
Alfa Bravo,

1

Poza bezpośrednimi odpowiedziami tutaj, należy zwrócić uwagę na drugą kluczową różnicę między python 2 i 3. Oficjalna wiki python dotyczy prawie wszystkich głównych różnic i skupia się na tym, kiedy należy użyć którejkolwiek z wersji. Ten post na blogu ma również dobrą robotę w wyjaśnianiu obecnego wszechświata python i jakoś nierozwiązanej łamigłówki przejścia na python 3.

O ile wiem, zaczynasz się uczyć języka python. Powinieneś wziąć pod uwagę powyższe artykuły, zanim przejdziesz dalej ścieżką do Pythona 3. Nie tylko będziesz musiał zmienić część swojej składni, musisz także zastanowić się, które pakiety będą dla ciebie dostępne (zaleta Pythona 2) i potencjalne optymalizacje, które można wprowadzić w kodzie (zaleta Pythona 3) .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.