Apa artinya “SyntaxError: Hilang tanda kurung dalam panggilan untuk 'mencetak'” dalam Python?

389

Ketika saya mencoba menggunakan printpernyataan dalam Python, itu memberi saya kesalahan ini:

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

Apa artinya?

ncoghlan
sumber

Jawaban:

601

Pesan kesalahan ini berarti bahwa Anda berusaha menggunakan Python 3 untuk mengikuti contoh atau menjalankan program yang menggunakan pernyataan Python 2 print:

print "Hello, World!"

Pernyataan di atas tidak berfungsi dalam Python 3. Dalam Python 3 Anda perlu menambahkan tanda kurung di sekitar nilai yang akan dicetak:

print("Hello, World!")

“SyntaxError: Hilang tanda kurung dalam panggilan untuk 'mencetak'” adalah pesan kesalahan baru yang ditambahkan dalam Python 3.4.2 terutama untuk membantu pengguna yang mencoba mengikuti tutorial Python 2 saat menjalankan Python 3.

Dalam Python 3, nilai pencetakan diubah dari pernyataan yang berbeda menjadi panggilan fungsi biasa, jadi sekarang perlu tanda kurung:

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

Dalam versi Python 3 yang lebih lama, interpreter hanya melaporkan kesalahan sintaksis generik, tanpa memberikan petunjuk yang berguna tentang apa yang mungkin salah:

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

Adapun mengapa print menjadi fungsi biasa di Python 3, itu tidak berhubungan dengan bentuk dasar pernyataan, tetapi lebih kepada bagaimana Anda melakukan hal-hal yang lebih rumit seperti mencetak beberapa item ke stderr dengan ruang tambahan daripada mengakhiri baris.

Dengan Python 2:

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

Dengan 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

Dimulai dengan rilis Python 3.6.3 pada September 2017, beberapa pesan kesalahan yang terkait dengan sintaks cetak Python 2.x telah diperbarui untuk merekomendasikan rekanan Python 3.x mereka:

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

Karena kasus "Hilang tanda kurung dalam panggilan untuk mencetak" adalah kesalahan sintaks waktu kompilasi dan karenanya memiliki akses ke kode sumber mentah, ia dapat menyertakan teks lengkap pada sisa baris dalam penggantian yang disarankan. Namun, saat ini ia tidak mencoba untuk mengerjakan kutipan yang sesuai untuk ditempatkan di sekitar ungkapan itu (itu bukan tidak mungkin, cukup rumit yang belum dilakukan).

Peningkatan TypeErroruntuk operator shift kanan juga telah disesuaikan:

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

Karena kesalahan ini dinaikkan ketika kode berjalan, daripada saat dikompilasi, kesalahan itu tidak memiliki akses ke kode sumber mentah, dan karenanya menggunakan meta-variabel ( <message>dan <output_stream>) dalam ekspresi penggantian yang disarankan alih-alih apa pun yang sebenarnya diketik pengguna yang diketikkan . Berbeda dengan kasus kesalahan sintaksis, itu mudah untuk menempatkan tanda kutip di sekitar ekspresi Python di pesan kesalahan pergeseran kanan kustom.

ncoghlan
sumber
3
Terima kasih kepada @ antti-haapala karena telah menambahkan ringkasan di bagian atas yang langsung menjawab pertanyaan sebelum melanjutkan ke penjelasan yang lebih panjang tentang asal-usul pesan kesalahan :)
ncoghlan
Saya juga mengalihkan jawaban ke komunitas wiki, karena terus mengumpulkan SO rep lebih lanjut untuk ini tidak terasa benar bagi saya (lihat bugs.python.org/issue21669 untuk latar belakang tentang bagaimana pesan kesalahan dan pertanyaan SO ini berkembang bersama)
ncoghlan
4
Halo! Saya pikir alat ini dapat membantu seseorang docs.python.org/2/library/2to3.html
Jhonatas Kleinkauff
1
Tambahkan baris dari impor print_function di masa depan dalam file 2,7 Anda untuk menambahkan baris python 3 print () baru ke kode Anda. Karenanya kode tersebut menjadi kompatibel dengan 2.7+ dan 3.0+
MasterControlProgram
Bagaimana Anda memaksa sistem untuk menggunakan Python 2.7 vs 3? Mungkin ini tempat yang bagus untuk itu.
Praxiteles
25

Sayangnya, komik xkcd lama tidak sepenuhnya mutakhir.

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

Sejak Python 3.0 Anda harus menulis:

print("Hello, World!")

Dan seseorang masih harus menulis antigravityperpustakaan itu :(

Kristen
sumber
6
antigravitasi apakah ada ... apakah Anda sudah mencoba mengimpornya? ;)
tyrion
18

Ada perubahan sintaksis dari Python 2 ke Python 3. Dalam Python 2,

print "Hello, World!" 

akan bekerja tetapi dalam Python 3, gunakan tanda kurung sebagai

print("Hello, World!")

Ini adalah sintaks yang setara dengan Scala dan dekat dengan Java.

Sagar balai
sumber
4

Jika kode Anda harus bekerja di Python 2 dan 3, Anda dapat mencapainya dengan memuat ini di awal program Anda:

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

Kemudian Anda dapat mencetak dengan cara Python 3:

print("python")

Jika Anda ingin mencetak sesuatu tanpa membuat baris baru - Anda dapat melakukan ini:

for number in range(0, 10):
    print(number, end=', ')
Lukasz
sumber
Tidak bekerja untuk saya di Python3 bahkan dengan impor itu. Kode tanpa tanda kurung.
logicbloke
3

Di Python 3, Anda hanya dapat mencetak sebagai:

print("STRING")

Namun dalam Python 2, tanda kurung tidak diperlukan.

Larry
sumber
3

Pada dasarnya, karena Python 3.x perlu Anda gunakan print tanda kurung.

Python 2.x : cetak "Lord of the Rings"

Python 3.x : print ("Lord of the Rings")


Penjelasan

printadalah pernyataan di 2.x , tapi itu fungsi di 3.x . Sekarang, ada sejumlah alasan bagus untuk ini.

  1. Dengan format fungsi Python 3.x, lebih banyak fleksibilitas muncul saat mencetak beberapa item dengan comman terpisah.
  2. Anda tidak dapat menggunakan splatting argumen dengan pernyataan. Dalam 3.x jika Anda memiliki daftar item yang ingin Anda cetak dengan pemisah, Anda dapat melakukan ini:
>>> items = ['foo', 'bar', 'baz']
>>> print(*items, sep='+') 
foo+bar+baz
  1. Anda tidak dapat mengganti pernyataan. Jika Anda ingin mengubah perilaku cetak, Anda bisa melakukan itu ketika fungsinya tetapi tidak ketika itu adalah pernyataan.
Om Sao
sumber
2

Saya juga bisa menambahkan bahwa saya tahu segalanya tentang perubahan sintaksis antara Python2.7dan Python3, dan kode saya ditulis dengan benar print("string")dan bahkan print(f"string")...

Tetapi setelah beberapa waktu debug saya menyadari bahwa skrip bash saya memanggil python seperti:

python file_name.py

yang memiliki efek memanggil skrip python saya secara default menggunakan python2.7yang memberi kesalahan. Jadi saya mengubah skrip bash saya menjadi:

python3 file_name.py

yang kasar menggunakan python3 untuk menjalankan skrip yang memperbaiki kesalahan.

Alfa Bravo
sumber
Anda juga bisa menambahkan shebang ke atas file untuk menyatakan Python mana yang memuat file dengan
OneCricketeer
Itu ide yang bagus ya!
Alfa Bravo
1

Di luar jawaban langsung di sini, orang harus mencatat perbedaan kunci lainnya antara python 2 dan 3. Wiki python resmi masuk ke hampir semua perbedaan utama dan berfokus pada kapan Anda harus menggunakan salah satu versi. Posting blog ini juga melakukan pekerjaan yang baik untuk menjelaskan alam semesta python saat ini dan teka-teki entah bagaimana yang belum terpecahkan untuk pindah ke python 3.

Sejauh yang saya tahu, Anda mulai belajar bahasa python. Anda harus mempertimbangkan artikel yang disebutkan di atas sebelum melanjutkan ke jalur python 3. Anda tidak hanya harus mengubah beberapa sintaks Anda, Anda juga perlu memikirkan paket mana yang akan tersedia untuk Anda (keuntungan dari python 2) dan potensi optimasi yang dapat dibuat dalam kode Anda (keuntungan dari python 3) .

Chad Van De Hey
sumber