Python'da “SyntaxError: 'print' çağrısında eksik parantez ne anlama geliyor?


389

printPython bir ifade kullanmaya çalıştığınızda , bana bu hatayı verir:

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

Bu ne anlama geliyor?

Yanıtlar:


601

Bu hata iletisi, bir örneği izlemek veya Python 2 printdeyimini kullanan bir programı çalıştırmak için Python 3'ü kullanmaya çalıştığınız anlamına gelir :

print "Hello, World!"

Yukarıdaki ifade Python 3'te çalışmaz. Python 3'te yazdırılacak değerin etrafına parantez eklemeniz gerekir:

print("Hello, World!")

“SyntaxError: 'print' çağrısında eksik parantezler” , Python 3'ü çalıştırırken Python 2 öğreticisini takip etmeye çalışan kullanıcılara yardımcı olmak için Python 3.4.2'de eklenen yeni bir hata mesajıdır.

Python 3'te, yazdırma değerleri ayrı bir ifade olmaktan sıradan bir işlev çağrısı olmaktan çıktı, bu yüzden şimdi parantezlere ihtiyaç duyuyor:

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

Python 3'ün önceki sürümlerinde, yorumlayıcı neyin yanlış gidebileceğine dair yararlı ipuçları vermeden genel bir sözdizimi hatası bildirir:

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

Gelince neden print ziyade bir boşluk bırakılarak yazılır ile stderr'e birden fazla öğe baskı ziyade çizgi biten gibi daha karmaşık şeyler yaptı nasıl, ifadenin temel şekliyle ilgili etmedi Python 3'te sıradan bir fonksiyon, oldu.

Python 2'de:

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

Python 3'te:

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

Eylül 2017'de Python 3.6.3 sürümünden başlayarak, Python 2.x yazdırma sözdizimi ile ilgili bazı hata mesajları, Python 3.x muadillerini önermek üzere güncellenmiştir:

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

"Yazdırma çağrısında eksik parantezler" durumu bir derleme zamanı sözdizimi hatası olduğundan ve bu nedenle ham kaynak koduna erişebildiğinden, önerilen değiştirmedeki satırın geri kalanına tam metni ekleyebilir. Bununla birlikte, şu anda bu ifadenin etrafına yerleştirmek için uygun alıntıları incelemeye çalışmamaktadır (bu imkansız değildir, henüz yapılmadığı için yeterince karmaşıktır).

TypeErrorSağa kaydırma operatörü için yükseltilmiş da özelleştirilmiş edilmiştir:

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

Kod çalıştığında değil, bu hata derlendiğinden kaynaklandığından, ham kaynak koduna erişimi yoktur ve bu nedenle kullanıcının yazdığı şey yerine önerilen değiştirme ifadesinde meta değişkenleri ( <message>ve <output_stream>) kullanır . Sözdizimi hata durumundan farklı olarak, özel sağ kaydırma hata iletisindeki Python ifadesinin etrafına tırnak koymak basittir.


3
Hata mesajının kökenlerinin daha uzun açıklamasına devam etmeden önce doğrudan soruyu cevaplayan özeti en üste eklediğiniz için @ antti-haapala'ya teşekkürlerim :)
ncoghlan

Ayrıca, sürekli olarak daha fazla SO temsilcisi biriktirmek bana doğru gelmediği için topluluğun wiki'sine de cevap verdim ( hata mesajının ve bu SO sorunun birlikte nasıl geliştiğine dair arka plan için bugs.python.org/issue21669 adresine bakın )
ncoghlan

4
Merhaba! Bu aracın birisine yardımcı olabileceğini düşünüyorum docs.python.org/2/library/2to3.html
Jhonatas Kleinkauff

1
Satırı ekleyin dan gelecek ithalat print_function kodunuzu yeni piton 3 print () satırları eklemek için 2.7 dosyada. Bu nedenle kod 2.7+ ve 3.0+ ile uyumlu hale gelir
MasterControlProgram

Sistemi Python 2.7 vs 3 kullanmaya nasıl zorlarsınız? Belki de bunun için iyi bir yerdir.
Praxiteles


18

Python 2'den Python 3'e sözdiziminde bir değişiklik var. Python 2'de,

print "Hello, World!" 

çalışır ancak Python 3'te parantezleri şu şekilde kullanın:

print("Hello, World!")

Bu, Scala'ya ve Java'ya yakın bir sözdizimidir.


4

Kodunuzun hem Python 2 hem de 3'te çalışması gerekiyorsa, bunu programınızın başına yükleyerek bunu elde edebilirsiniz:

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

Sonra Python 3 ile yazdırabilirsiniz:

print("python")

Yeni bir satır oluşturmadan bir şey yazdırmak istiyorsanız - bunu yapabilirsiniz:

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

Bu ithalatta bile Python3'te benim için çalışmadı. Kod parantez olmadan.
logicbloke

3

Python 3'te yalnızca şu şekilde yazdırabilirsiniz:

print("STRING")

Ancak Python 2'de parantez gerekli değildir.


3

Temel olarak, Python 3.x'ten beri printparantez ile kullanmanız gerekir .

Python 2.x : "Yüzüklerin Efendisi" yazdır

Python 3.x : print ("Yüzüklerin Efendisi")


Açıklama

printBir oldu deyimi içinde 2.x , ama bir var fonksiyonu içinde 3.x . Şimdi, bunun birkaç iyi nedeni var.

  1. Python 3.x'in fonksiyon formatı ile, birden çok öğeyi virgülle ayrılmış olarak yazdırırken daha fazla esneklik sağlanır.
  2. Bir ifadeyle splatting argümanını kullanamazsınız. Bir ayırıcıyla yazdırmak istediğiniz öğelerin bir listeniz varsa 3.x'te şunları yapabilirsiniz:
>>> items = ['foo', 'bar', 'baz']
>>> print(*items, sep='+') 
foo+bar+baz
  1. Bir ifadeyi geçersiz kılamazsınız. Yazdırma davranışını değiştirmek istiyorsanız, bunu bir işlev olduğunda yapabilirsiniz, ancak bir deyim olduğunda değil.

2

Ayrıca sadece Python2.7ve arasındaki sözdizimi değişikliği hakkında her şeyi bildiğimi ekleyebilirim Python3ve kodum doğru print("string")ve hatta yazılmıştır print(f"string")...

Ama hata ayıklama bir süre sonra benim bash script benim gibi python çağırdığını fark ettim:

python dosya_adı.py

hangi python2.7hata verdi python komut dosyası varsayılan olarak kullanarak etkisi vardı . Bu yüzden bash betiğimi şu şekilde değiştirdim:

python3 dosya_adı.py

hangi kaba hata düzelten komut dosyasını çalıştırmak için python3 kullanır.


Ayrıca dosyayı hangi Python ile yükleyeceğini belirtmek için dosyanın üst kısmına bir
shebang ekleyebilirsiniz

Bu iyi bir fikir evet!
Alfa Bravo

1

Buradaki doğrudan cevapların dışında, python 2 ve 3 arasındaki diğer önemli farkı not etmeliyiz. Resmi python wiki , neredeyse tüm önemli farklılıklara girer ve sürümlerden birini ne zaman kullanmanız gerektiğine odaklanır. Bu blog yazısı ayrıca mevcut python evrenini ve python 3'e geçmenin bir şekilde çözülmemiş bulmacasını açıklamak için iyi bir iş çıkarıyor.

Anlayabildiğim kadarıyla, python dilini öğrenmeye başlıyorsunuz. Python 3 rotasında devam etmeden önce yukarıda bahsedilen makaleleri göz önünde bulundurmalısınız. Sadece sözdiziminizin bir kısmını değiştirmek zorunda kalmayacak, aynı zamanda hangi paketlerin kullanabileceğinizi (python 2'nin bir avantajı) ve kodunuzda yapılabilecek potansiyel optimizasyonları (python 3'ün bir avantajı) düşünmeniz gerekecektir. .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.