Có nghĩa là SyntaxError: Thiếu dấu ngoặc trong lệnh gọi 'in' có nghĩa là gì trong Python?


389

Khi tôi cố gắng sử dụng một printcâu lệnh trong Python, nó sẽ báo lỗi cho tôi:

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

Điều đó nghĩa là gì?

Câu trả lời:


601

Thông báo lỗi này có nghĩa là bạn đang cố gắng sử dụng Python 3 để theo dõi một ví dụ hoặc chạy chương trình sử dụng printcâu lệnh Python 2 :

print "Hello, World!"

Câu lệnh trên không hoạt động trong Python 3. Trong Python 3, bạn cần thêm dấu ngoặc đơn xung quanh giá trị sẽ được in:

print("Hello, World!")

SyntaxError: Thiếu dấu ngoặc đơn trong lệnh gọi 'in' là một thông báo lỗi mới được thêm vào Python 3.4.2 để giúp người dùng đang cố gắng làm theo hướng dẫn Python 2 trong khi chạy Python 3.

Trong Python 3, các giá trị in đã thay đổi từ một câu lệnh riêng biệt thành một lệnh gọi hàm thông thường, vì vậy giờ đây nó cần dấu ngoặc đơn:

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

Trong các phiên bản trước của Python 3, trình thông dịch chỉ báo cáo lỗi cú pháp chung, mà không cung cấp bất kỳ gợi ý hữu ích nào về những gì có thể xảy ra:

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

sao print trở thành một chức năng thông thường trong Python 3, điều đó không liên quan đến hình thức cơ bản của câu lệnh, mà là cách bạn đã làm những việc phức tạp hơn như in nhiều mục thành stderr bằng dấu cách thay vì kết thúc dòng.

Trong Python 2:

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

Trong 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

Bắt đầu với phiên bản Python 3.6.3 vào tháng 9 năm 2017, một số thông báo lỗi liên quan đến cú pháp in Python 2.x đã được cập nhật để đề xuất các đối tác Python 3.x của họ:

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

Vì trường hợp "Thiếu dấu ngoặc trong lệnh gọi để in" là lỗi cú pháp thời gian biên dịch và do đó có quyền truy cập vào mã nguồn thô, nên có thể bao gồm toàn bộ văn bản trên phần còn lại của dòng trong phần thay thế được đề xuất. Tuy nhiên, hiện tại nó không cố gắng đưa ra các trích dẫn thích hợp để đặt xung quanh biểu thức đó (điều đó không phải là không thể, chỉ đủ phức tạp mà nó chưa được thực hiện).

Việc TypeErrornâng cao cho toán tử dịch chuyển bên phải cũng đã được tùy chỉnh:

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

Vì lỗi này được đưa ra khi mã chạy, thay vì khi được biên dịch, nó không có quyền truy cập vào mã nguồn thô và do đó sử dụng các biến meta ( <message><output_stream>) trong biểu thức thay thế được đề xuất thay vì bất cứ điều gì người dùng thực sự gõ . Không giống như trường hợp lỗi cú pháp, thật đơn giản để đặt dấu ngoặc kép quanh biểu thức Python trong thông báo lỗi dịch chuyển bên phải tùy chỉnh.


3
Tôi cảm ơn @ antti-haapala vì đã thêm phần tóm tắt ở đầu câu trả lời trực tiếp câu hỏi trước khi tiếp tục giải thích dài hơn về nguồn gốc của thông báo lỗi :)
ncoghlan 11/05/2015

Tôi cũng đã chuyển câu trả lời sang wiki cộng đồng, vì tích lũy đều đặn SO rep cho điều này không phù hợp với tôi (xem bug.python.org/su21669 để biết thông tin về lỗi và câu hỏi SO này đã phát triển như thế nào)
ncoghlan

4
Xin chào! Tôi nghĩ rằng công cụ này có thể giúp một người nào đó docs.python.org/2/library/2to3.html
Jhonatas Kleinkauff

1
Thêm dòng từ nhập print_function trong tương lai trong tệp 2.7 của bạn để thêm các dòng print () python 3 mới vào mã của bạn. Do đó, mã trở nên tương thích với 2.7+ và 3.0+
MasterControlProgram

Làm thế nào để bạn buộc hệ thống sử dụng Python 2.7 vs 3? Có lẽ đây là một nơi tốt cho nó.
Praxiteles


18

Có sự thay đổi cú pháp từ Python 2 sang Python 3. Trong Python 2,

print "Hello, World!" 

sẽ hoạt động nhưng trong Python 3, sử dụng dấu ngoặc đơn như

print("Hello, World!")

Đây là cú pháp tương đương với Scala và gần với Java.


4

Nếu mã của bạn phải hoạt động trong cả Python 2 và 3, bạn có thể đạt được điều này bằng cách tải mã này vào đầu chương trình của bạn:

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

Sau đó, bạn có thể in theo cách 3 của Python:

print("python")

Nếu bạn muốn in một cái gì đó mà không tạo một dòng mới - bạn có thể làm điều này:

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

Không hoạt động với tôi trong Python3 ngay cả với lần nhập đó. Mã không có dấu ngoặc đơn.
logicbloke

3

Trong Python 3, bạn chỉ có thể in dưới dạng:

print("STRING")

Nhưng trong Python 2, dấu ngoặc đơn là không cần thiết.


3

Về cơ bản, vì Python 3.x bạn cần sử dụng printvới dấu ngoặc đơn.

Python 2.x : in "Chúa tể những chiếc nhẫn"

Python 3.x : print ("Chúa tể của những chiếc nhẫn")


Giải thích

printlà một tuyên bố trong 2.x , nhưng đó là một chức năng trong 3.x . Bây giờ, có một số lý do tốt cho việc này.

  1. Với định dạng chức năng của Python 3.x, sẽ linh hoạt hơn khi in nhiều mục với dấu phẩy được phân tách.
  2. Bạn không thể sử dụng phép nối đối số với một câu lệnh. Trong 3.x nếu bạn có một danh sách các mục mà bạn muốn in bằng dấu phân cách, bạn có thể thực hiện việc này:
>>> items = ['foo', 'bar', 'baz']
>>> print(*items, sep='+') 
foo+bar+baz
  1. Bạn không thể ghi đè một tuyên bố. Nếu bạn muốn thay đổi hành vi in, bạn có thể làm điều đó khi đó là chức năng chứ không phải khi đó là câu lệnh.

2

Tôi cũng có thể chỉ cần thêm rằng tôi biết mọi thứ về thay đổi cú pháp giữa Python2.7Python3và mã của tôi được viết chính xác như print("string")và thậm chí print(f"string")...

Nhưng sau một thời gian gỡ lỗi, tôi nhận ra rằng tập lệnh bash của tôi đang gọi python như:

python file_name.py

Theo mặc định, có tác dụng gọi kịch bản python của tôi bằng cách sử dụng python2.7mà đã báo lỗi. Vì vậy, tôi đã thay đổi tập lệnh bash của mình thành:

python3 file_name.py

mà thô sử dụng python3 để chạy tập lệnh đã sửa lỗi.


Bạn cũng có thể thêm một shebang vào đầu tệp để cho biết Python sẽ tải tệp bằng
OneCricketeer

Đó là một ý tưởng tốt có!
Alfa Bravo

1

Ngoài câu trả lời trực tiếp ở đây, người ta cần lưu ý sự khác biệt chính khác giữa python 2 và 3. wiki python chính thức đi vào hầu hết tất cả các khác biệt chính và tập trung vào khi nào bạn nên sử dụng một trong hai phiên bản. Bài đăng trên blog này cũng làm tốt công việc giải thích vũ trụ trăn hiện tại và câu đố chưa được giải quyết bằng cách nào đó chuyển sang python 3.

Theo như tôi có thể nói, bạn đang bắt đầu học ngôn ngữ python. Bạn nên xem xét các bài viết đã nói ở trên trước khi tiếp tục xuống tuyến đường python 3. Bạn không chỉ phải thay đổi một số cú pháp của mình, bạn cũng sẽ cần phải suy nghĩ về các gói nào sẽ có sẵn cho bạn (một lợi thế của python 2) và các tối ưu hóa tiềm năng có thể được thực hiện trong mã của bạn (một lợi thế của python 3) .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.