“ SyntaxError: การขาดวงเล็บในการเรียกเพื่อ 'พิมพ์'” หมายถึงอะไรใน Python


389

เมื่อฉันพยายามที่จะใช้printคำสั่งใน Python มันทำให้ฉันมีข้อผิดพลาดนี้:

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

นั่นหมายความว่าอย่างไร?

คำตอบ:


601

ข้อความแสดงข้อผิดพลาดนี้หมายความว่าคุณกำลังพยายามใช้ Python 3 เพื่อทำตามตัวอย่างหรือเรียกใช้โปรแกรมที่ใช้printคำสั่งPython 2 :

print "Hello, World!"

ข้อความข้างต้นไม่สามารถใช้งานได้ใน Python 3 ใน Python 3 คุณจะต้องเพิ่มวงเล็บรอบค่าที่จะพิมพ์:

print("Hello, World!")

“ SyntaxError: การขาดเครื่องหมายวงเล็บในการเรียกไปที่ 'print'”เป็นข้อความแสดงข้อผิดพลาดใหม่ที่ถูกเพิ่มใน Python 3.4.2 เป็นหลักเพื่อช่วยผู้ใช้ที่พยายามติดตาม Python 2 ในขณะที่ใช้งาน Python 3

ใน Python 3 การพิมพ์ค่าเปลี่ยนจากการเป็นคำสั่งที่แตกต่างกันเพื่อการเรียกใช้ฟังก์ชั่นสามัญดังนั้นตอนนี้มันต้องการวงเล็บ:

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

ใน Python 3 รุ่นก่อนหน้าล่ามจะรายงานข้อผิดพลาดทางไวยากรณ์ทั่วไปโดยไม่ต้องให้คำแนะนำที่เป็นประโยชน์เกี่ยวกับสิ่งที่อาจผิดพลาด:

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

สำหรับสาเหตุที่ printกลายเป็นฟังก์ชั่นธรรมดาใน Python 3 นั่นไม่ได้เกี่ยวข้องกับรูปแบบพื้นฐานของคำสั่ง แต่เป็นวิธีที่คุณทำสิ่งที่ซับซ้อนมากขึ้นเช่นการพิมพ์หลายรายการไปยัง stderr ด้วยช่องว่างท้ายแทนที่จะจบบรรทัด

ใน Python 2:

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

ใน 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

เริ่มต้นด้วยการเปิดตัว Python 3.6.3 ในเดือนกันยายน 2560 ข้อความแสดงข้อผิดพลาดบางอย่างเกี่ยวกับไวยากรณ์การพิมพ์ Python 2.x ได้รับการอัปเดตเพื่อแนะนำ Python 3.x คู่หูของพวกเขา:

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

เนื่องจากกรณี "ไม่มีวงเล็บในการเรียกเพื่อพิมพ์" เป็นข้อผิดพลาดทางไวยากรณ์เวลาคอมไพล์และด้วยเหตุนี้จึงมีการเข้าถึงซอร์สโค้ดดิบจึงสามารถรวมข้อความแบบเต็มในส่วนที่เหลือของบรรทัดในการแทนที่ที่แนะนำ อย่างไรก็ตามในขณะนี้มันไม่ได้พยายามหาคำพูดที่เหมาะสมเพื่อวางรอบนิพจน์นั้น (นั่นเป็นไปไม่ได้เลยเพียงซับซ้อนพอที่มันยังไม่ได้ทำ)

TypeErrorนอกจากนี้ยังมีการปรับแต่งการยกสำหรับผู้ปฏิบัติงานกะที่เหมาะสมด้วย:

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

เนื่องจากข้อผิดพลาดนี้เกิดขึ้นเมื่อโค้ดทำงานแทนที่จะเป็นคอมไพล์จึงไม่สามารถเข้าถึงซอร์สโค้ดแบบดิบดังนั้นจึงใช้เมตาตัวแปร ( <message>และ<output_stream>) ในนิพจน์การแทนที่ที่แนะนำแทนสิ่งที่ผู้ใช้พิมพ์จริง . ซึ่งแตกต่างจากกรณีข้อผิดพลาดทางไวยากรณ์มันตรงไปตรงมาเพื่อวางคำพูดรอบการแสดงออก Python ในข้อความแสดงข้อผิดพลาดกะขวาที่กำหนดเอง


3
ขอบคุณของฉันเพื่อ @ Antti-Haapala สำหรับการเพิ่มสรุปที่ด้านบนที่โดยตรงตอบคำถามก่อนจะเดินต่อไปยังคำอธิบายยาวของต้นกำเนิดของข้อผิดพลาด :) ที่
ncoghlan

ฉันยังเปลี่ยนคำตอบเป็นวิกิชุมชนเช่นเดียวกับที่สะสมอย่างต่อเนื่องดังนั้นตัวแทนสำหรับสิ่งนี้รู้สึกไม่ถูกต้องสำหรับฉัน (ดูbugs.python.org/issue21669สำหรับพื้นหลังเกี่ยวกับวิธีที่ข้อความแสดงข้อผิดพลาดและคำถาม SO นี้มีส่วนร่วม)
ncoghlan

4
สวัสดี! ฉันคิดว่าเครื่องมือนี้สามารถช่วยใครบางคนdocs.python.org/2/library/2to3.html
Jhonatas Kleinkauff

1
เพิ่มบรรทัดจากการอิมพอร์ต print_functionในอนาคตในไฟล์ 2.7 ของคุณเพื่อเพิ่มบรรทัด python 3 print () ใหม่ลงในโค้ดของคุณ ดังนั้นรหัสจะเข้ากันได้กับ 2.7+ และ 3.0+
MasterControlProgram

คุณจะบังคับให้ระบบใช้ Python 2.7 กับ 3 ได้อย่างไร บางทีนี่อาจเป็นสถานที่ที่ดีสำหรับมัน
Praxiteles

25

น่าเสียดายที่การ์ตูน xkcdรุ่นเก่ายังไม่ทันสมัยอีกต่อไป

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

ตั้งแต่ Python 3.0 คุณต้องเขียน:

print("Hello, World!")

และบางคนยังคงต้องเขียนantigravityห้องสมุดนั่น:(


6
มีแรงต้านแรงโน้มถ่วงหรือไม่ ... คุณลองนำเข้าแล้วหรือยัง? ;)
tyrion


18

มีการเปลี่ยนแปลงทางไวยากรณ์จาก Python 2 เป็น Python 3 ใน Python 2

print "Hello, World!" 

จะทำงานได้ แต่ใน Python 3 ให้ใช้วงเล็บเป็น

print("Hello, World!")

นี่เป็นไวยากรณ์ที่เทียบเท่ากับ Scala และใกล้กับ Java


4

หากรหัสของคุณควรทำงานได้ทั้งใน Python 2 และ 3 คุณสามารถทำได้โดยการโหลดที่จุดเริ่มต้นของโปรแกรมของคุณ:

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

จากนั้นคุณสามารถพิมพ์ด้วยวิธี Python 3:

print("python")

หากคุณต้องการพิมพ์โดยไม่ต้องสร้างบรรทัดใหม่ - คุณสามารถทำได้:

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

ไม่ได้ผลสำหรับฉันใน Python3 แม้จะมีการนำเข้านั้น รหัสไม่อยู่ในวงเล็บ
logicbloke


3

โดยทั่วไปตั้งแต่ Python 3.x คุณต้องใช้printกับวงเล็บ

Python 2.x : พิมพ์ "ลอร์ดออฟเดอะริงส์"

Python 3.x : print ("ลอร์ดออฟเดอะริงส์")


ชี้แจง

printเป็นคำสั่งใน2.xแต่มันเป็นฟังก์ชั่นใน3.x ตอนนี้มีหลายเหตุผลที่ดีสำหรับเรื่องนี้

  1. ด้วยรูปแบบฟังก์ชั่นของ Python 3.x มีความยืดหยุ่นมากขึ้นเมื่อพิมพ์หลายรายการโดยคั่นด้วยคอมมา
  2. คุณไม่สามารถใช้การโต้เถียงด้วยข้อความสั่ง ใน 3.x หากคุณมีรายการของรายการที่คุณต้องการพิมพ์ด้วยตัวคั่นคุณสามารถทำสิ่งนี้:
>>> items = ['foo', 'bar', 'baz']
>>> print(*items, sep='+') 
foo+bar+baz
  1. คุณไม่สามารถแทนที่คำสั่ง หากคุณต้องการเปลี่ยนพฤติกรรมของการพิมพ์คุณสามารถทำได้เมื่อเป็นฟังก์ชั่น แต่ไม่ใช่เมื่อเป็นคำสั่ง

2

ฉันยังสามารถเพิ่มที่ฉันรู้ทุกอย่างเกี่ยวกับการเปลี่ยนแปลงทางไวยากรณ์ระหว่างPython2.7และPython3และรหัสของฉันถูกเขียนอย่างถูกต้องเป็นprint("string")และแม้กระทั่ง print(f"string")...

แต่หลังจากการดีบั๊กฉันรู้ว่า bash script ของฉันกำลังเรียกหลามว่า:

หลาม file_name.py

ซึ่งมีผลในการโทรสคริปต์ของฉันโดยใช้ค่าเริ่มต้นpython2.7ซึ่งทำให้ข้อผิดพลาด ดังนั้นฉันจึงเปลี่ยนสคริปต์ทุบตีเป็น:

python3 file_name.py

อันไหนของหยาบใช้ python3 เพื่อเรียกใช้สคริปต์ซึ่งแก้ไขข้อผิดพลาด


คุณสามารถเพิ่ม shebang ไปยังด้านบนของไฟล์เพื่อระบุว่า Python สำหรับโหลดไฟล์ด้วย
OneCricketeer

นั่นเป็นความคิดที่ดีใช่!
Alfa Bravo

1

นอกเหนือจากคำตอบโดยตรงที่นี่เราควรทราบถึงความแตกต่างที่สำคัญระหว่าง python 2 และ 3 วิกิของ python อย่างเป็นทางการเข้าสู่ความแตกต่างที่สำคัญเกือบทั้งหมดและมุ่งเน้นที่เมื่อคุณควรใช้เวอร์ชันใดเวอร์ชันหนึ่ง โพสต์บล็อกนี้ยังใช้งานได้ดีในการอธิบายจักรวาลไพ ธ อนปัจจุบันและปริศนาที่ไม่คลาดเคลื่อนในการย้ายไปยังไพ ธ อน 3

เท่าที่ฉันสามารถบอกได้คุณกำลังเริ่มเรียนรู้ภาษาไพ ธ อน คุณควรพิจารณาบทความข้างต้นก่อนที่จะดำเนินการต่อเส้นทางหลาม 3 ไม่เพียง แต่คุณจะต้องเปลี่ยนไวยากรณ์ของคุณคุณยังต้องคิดว่าจะให้แพ็คเกจใดบ้าง (ข้อดีของ python 2) และการเพิ่มประสิทธิภาพที่อาจเกิดขึ้นในโค้ดของคุณ (ข้อดีของ python 3) .

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.