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 print
instrukcji 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).
TypeError
Podniesiony 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.
Niestety stary komiks xkcd nie jest już całkowicie aktualny.
Od wersji Python 3.0 musisz pisać:
I ktoś jeszcze musi napisać tę
antigravity
bibliotekę :(źródło
Zmiana składni z Python 2 na Python 3. W Python 2
będzie działać, ale w Pythonie 3 użyj nawiasów jako
Jest to odpowiednik składni Scali i zbliżony do Javy.
źródło
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:
Następnie możesz wydrukować w Python 3 sposób:
Jeśli chcesz wydrukować coś bez tworzenia nowej linii - możesz to zrobić:
źródło
W Pythonie 3 możesz drukować tylko jako:
Ale w Pythonie 2 nawiasy nie są konieczne.
źródło
Zasadniczo, ponieważ Python 3.x należy używać
print
z nawiasami.Python 2.x : wydrukuj „Władca pierścieni”
Python 3.x : print („Władca pierścieni”)
Wyjaśnienie
print
było stwierdzenie w 2.x , ale jest to funkcja w 3.x . Istnieje wiele dobrych powodów.źródło
Mógłbym również dodać, że wiedziałem wszystko o zmianie składni między
Python2.7
iPython3
, a mój kod został poprawnie napisany jakoprint("string")
a nawetprint(f"string")
...Ale po pewnym czasie debugowania zdałem sobie sprawę, że mój skrypt bash wywołuje Pythona:
co spowodowało domyślne wywołanie mojego skryptu python,
python2.7
który dał błąd. Więc zmieniłem skrypt bash na:która z grubej używa Python3 do uruchomienia skryptu, który naprawił błąd.
źródło
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) .
źródło