In Python 3 không có dấu ngoặc đơn


83

Trước đây printlà một câu lệnh trong Python 2, nhưng bây giờ nó đã trở thành một hàm yêu cầu dấu ngoặc đơn trong Python 3.

Có cách nào để loại bỏ các dấu ngoặc đơn này trong Python 3 không? Có thể bằng cách xác định lại chức năng in?

Vì vậy, thay vì

print ("Hello stack over flowers")

Tôi có thể gõ:

print "Hello stack over flowers"

4
Có lý do cụ thể nào mà bạn muốn làm điều này không? Hay bạn chỉ tò mò? Nó thường không phải là thực hành tốt để xác định lại từ khóa ngay cả khi nó có thể.
Michael S Priz

6
Vì tò mò, tại sao mọi người lại bỏ phiếu cho điều này? Tôi không hiểu nó nằm ngoài hướng dẫn SO như thế nào.
Michael S Priz

21
Tôi đang sử dụng Python 3. Tuy nhiên, việc gõ ()mọi lúc sẽ tốn thời gian một cách không cần thiết.
Laura

7
Michael, anh có vẻ không tử tế lắm. Tôi đã làm gì sai sao? Tôi đang hỏi một câu hỏi trung thực ngay cả khi nghe có vẻ giống như một tiêu chuẩn mã hóa giải pháp cho bạn. Nếu nó là "tiêu chuẩn", họ sẽ không thay đổi nó trong Python 3, phải không?
Laura

4
Tôi cho rằng tôi nên nói "đặc điểm ngôn ngữ" :) Tôi xin lỗi nếu bất cứ điều gì tôi nói là xúc phạm. Tôi chỉ cố gắng giúp bạn tận dụng tối đa SO.
Michael S Priz

Câu trả lời:


26

Mặc dù bạn cần một cặp dấu ngoặc đơn để in trong Python 3, bạn không cần dấu cách sau nữa print, vì đó là một hàm. Vì vậy, đó chỉ là một ký tự phụ duy nhất.

Nếu bạn vẫn thấy việc nhập một cặp dấu ngoặc đơn là "tốn thời gian không cần thiết", bạn có thể thực hiện p = printvà lưu một vài ký tự theo cách đó. Vì bạn có thể liên kết các tham chiếu mới với các hàm nhưng không liên kết với từ khóa, bạn chỉ có thể thực hiện printphím tắt này trong Python 3.

Python 2:

>>> p = print
  File "<stdin>", line 1
    p = print
            ^
SyntaxError: invalid syntax

Python 3:

>>> p = print
>>> p('hello')
hello

Nó sẽ làm cho mã của bạn khó đọc hơn, nhưng bạn sẽ lưu một vài ký tự đó mỗi khi bạn in thứ gì đó.


Cảm ơn TigerhawkT3. Có, điều này sẽ tiết kiệm thời gian, nhưng như bạn đã nói, nó sẽ làm cho mã khó đọc hơn.
Laura

@Tigerhawk workaround này không tương thích với IDE
Chandra Shekhar

1
@ChandraShekhar - IDE nào? Bạn đang nói về cái gì Không có lý do gì để điều này bị ảnh hưởng bởi sự lựa chọn IDE.
TigerhawkT3

1
@ TigerhawkT3 tôi đã cố gắng như nhau trong Eclipse nơi nó thất bại trong việc làm việc
Chandra Shekhar

4
@ChandraShekhar - Và nó "không tương thích" theo cách nào? Điều gì xảy ra khi bạn thử nó?
TigerhawkT3

7

Sử dụng printkhông có dấu ngoặc đơn trong mã Python 3 không phải là một ý kiến ​​hay. Cũng không phải là tạo bí danh, v.v. Nếu đó là một công cụ phá vỡ thỏa thuận, hãy sử dụng Python 2.

Tuy nhiên, printkhông có dấu ngoặc đơn có thể hữu ích trong trình bao tương tác. Nó không thực sự là vấn đề giảm số lượng ký tự, mà là tránh phải nhấn Shift hai lần mỗi khi bạn muốn in thứ gì đó trong khi bạn đang gỡ lỗi. IPython cho phép bạn gọi các hàm mà không cần sử dụng dấu ngoặc đơn nếu bạn bắt đầu dòng bằng dấu gạch chéo:

Python 3.6.6 (default, Jun 28 2018, 05:43:53)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: var = 'Hello world'

In [2]: /print var
Hello world

Và nếu bạn bật autocall, bạn thậm chí sẽ không cần nhập dấu gạch chéo:

In [3]: %autocall
Automatic calling is: Smart

In [4]: print var
------> print(var)
Hello world

Việc sử dụng python 2 như một giải pháp thay thế, như được đề xuất bởi bài đăng, sẽ sớm không còn khả thi nữa.
Arnaud

5

Sử dụng Autohotkey để tạo macro. AHK miễn phí và cài đặt đơn giản. www.autohotkey.com

Bạn có thể gán macro cho, ví dụ, alt-p:

!p::send print(){Left}

Điều đó sẽ làm cho alt-p đưa ra print () và di chuyển con trỏ của bạn vào bên trong parens.

Hoặc, tốt hơn nữa, để giải quyết trực tiếp vấn đề của bạn, bạn xác định một nơi lưu trữ tự động và giới hạn phạm vi của nó khi tệp đang mở có phần mở rộng .py:

#IfWinActive .py            ;;; scope limiter
:b*:print ::print(){Left}   ;;; I forget what b* does. The rest should be clear 
#IfWinActive                ;;; remove the scope limitation

Đây là một giải pháp đảm bảo, không đau, trong suốt.


4

Tập lệnh AHK là một ý tưởng tuyệt vời. Chỉ dành cho những người quan tâm, tôi cần thay đổi một chút để phù hợp với mình:

SetTitleMatchMode,2         ;;; allows for a partial search 
#IfWinActive, .py           ;;; scope limiter to only python files
:b*:print ::print(){Left}   ;;; I forget what b* does
#IfWinActive                ;;; remove the scope limitation

3

Không. Đó sẽ luôn là lỗi cú pháp trong Python 3. Hãy cân nhắc sử dụng 2to3để dịch mã của bạn sang Python 3


10
Tôi đang sử dụng Python 3. Tôi chỉ muốn tránh nhập dấu ngoặc đơn mọi lúc. shift+ 9..... sau đó lại shift+ 0là hết.
Laura

Xin lỗi vì các lệnh gọi hàm khiến bạn khó nhập. Bản thân tôi là một người đánh máy khá tệ, vì vậy mặc dù tôi không bị khuyết tật về thể chất, tôi vẫn làm những gì có thể để giảm thiểu việc sử dụng các phím bị dịch chuyển.
holdenweb

Rõ ràng, không ai đánh giá cao sự đơn giản của mũi tên LÊN khi sử dụng tính năng "nhớ lại lịch sử" bash. Nó đơn giản. Tương tự như vậy print, nó sẽ không bị cản trở bởi các kỹ thuật gỡ lỗi vô ích như một cặp dấu ngoặc đơn.
John Greene

Có những lập luận cho điều đó, chúng đã được luyện tập kỹ lưỡng trước khi Python 3. Mặc dù dấu ngoặc đơn thừa có thể gây bất tiện cho những người đánh máy kém print, nhưng tôi tin rằng sự linh hoạt được cung cấp bởi khả năng xác định lại được cho là xứng đáng.
holdenweb

1

Bạn không thể, bởi vì cách duy nhất bạn có thể làm mà không có dấu ngoặc đơn là đặt nó là một từ khóa, như trong Python 2. Bạn không thể định nghĩa từ khóa theo cách thủ công, vì vậy không.


1

Cuối cùng tôi đã tìm ra regex để thay đổi tất cả những điều này trong các tập lệnh ví dụ Python2 cũ. Nếu không, hãy sử dụng 2to3.py.

Hãy dùng thử trên Regexr.com, không hoạt động trong NP ++ (?):

find:     (?<=print)( ')(.*)(')
replace: ('$2')

cho các biến:

(?<=print)( )(.*)(\n)
('$2')\n

cho nhãn và biến:

(?<=print)( ')(.*)(',)(.*)(\n)
('$2',$4)\n

Dưới đây là một regex mà làm việc trong NP ++(?<=print)( ')(.*)(') \('$2'\)
Jack

Cảm ơn @Jack, cần thiết để thoát khỏi dấu ngoặc đơn (chỉ cần thay thế?) .. tốt để biết. Ngoài ra, tôi đã tìm thấy một thủ thuật bán liên quan mà Py3 nhận ra có khoảng cách giữa print ('string'), để có thể in ra dễ dàng hơn và sau đó sử dụng tính năng tự động đóng của nhiều trình chỉnh sửa để thêm dấu ngoặc đơn và sau đó trích dẫn.
alchemy

0

Trong Python 3, print là một hàm, trong khi nó từng là một câu lệnh trong các phiên bản trước. Như @holdenweb đã đề xuất, hãy sử dụng 2to3 để dịch mã của bạn.

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.