Tại sao Python không có ý kiến ​​đa dòng?


252

OK, tôi biết rằng chuỗi ba trích dẫn có thể đóng vai trò là nhận xét đa dòng. Ví dụ,

"""Hello, I am a 
   multiline comment"""

'''Hello, I am a 
   multiline comment'''

Nhưng về mặt kỹ thuật nói đây là những chuỗi, đúng không?

Tôi đã googled và đọc hướng dẫn phong cách Python, nhưng tôi không thể tìm thấy câu trả lời kỹ thuật về lý do tại sao không có triển khai chính thức của multiline, / * * / loại bình luận. Tôi không có vấn đề gì khi sử dụng ba trích dẫn, nhưng tôi hơi tò mò về điều gì dẫn đến quyết định thiết kế này.


8
Nếu bạn có thể làm điều đó như một chuỗi tại sao thêm nhiều cách?
Brody

12
Chỉ muốn thêm, rằng nó thất bại nếu những gì bạn đang cố gắng bình luận xảy ra cũng có các bình luận / chuỗi nhiều dòng. Và đó là tất nhiên, là lý do tại sao chúng ta cần chúng.
nycynik

50
@ S.Lott Tôi nghĩ đó là một câu hỏi hữu ích. Để hiểu tại sao Python tốt, điều quan trọng là phải hiểu các quyết định thiết kế đã được đưa ra (và các quyết định đang diễn ra vẫn đang được đưa ra). Câu hỏi không phải là tranh luận hay chiến đấu; nó tò mò Không cần phải quá khắc nghiệt về sự tò mò.
Đánh dấu E. Haase

6
Nếu bạn cần một nhận xét nhiều dòng cho cod chỉ if False:là mã
AturSams 11/03/2015

5
@Brody Vì chuỗi được xử lý. Bình luận bị bỏ qua. Có vấn đề với việc sử dụng chuỗi như bình luận. Chỉ cần nhìn xung quanh :)
ADTC 18/07/2015

Câu trả lời:


266

Tôi nghi ngờ bạn sẽ nhận được câu trả lời tốt hơn, "Guido không cảm thấy cần bình luận nhiều dòng".

Guido đã tweet về điều này:

Mẹo Python: Bạn có thể sử dụng chuỗi nhiều dòng làm nhận xét nhiều dòng. Trừ khi được sử dụng làm tài liệu, chúng không tạo ra mã! :-)


28
Xem tweet của Guido về điều này.
Petr Viktorin

15
Một nhược điểm của việc kết hợp chuỗi nhiều dòng và nhận xét khối là IDE không biết bạn muốn gì do đó không thể hiển thị nhận xét theo phong cách khác khi cần.
Baiyan Huang

21
Nó cũng làm cho không thể nhận xét mã bằng các chuỗi nhiều dòng (và có thể dẫn đến lỗi thụt lề nếu bạn không cẩn thận). Ew!
Mike Graham

3
Tôi đã làm việc trong nhiều lĩnh vực trong đó nếu mã của bạn chứa mã nhận xét thì mã của bạn bị từ chối và thậm chí bạn có thể thấy mình được mời cập nhật CV. Xóa mã không cần thiết, không phải là vấn đề nếu mã nằm dưới sự kiểm soát phiên bản hoặc sử dụng if False:trước mã cần được tắt.
Steve Barnes

4
@SteveBarnes đồng ý rằng các khối lớn mã nhận xét trong sản xuất là xấu. Nhưng tôi không hiểu tại sao if Falsetốt hơn. Nó hoàn thành chính xác điều tương tự, trong khi chưa rõ ràng (vì trong nháy mắt, khối mã đã bị vô hiệu hóa).

59

Nhận xét nhiều dòng dễ dàng bị phá vỡ. Điều gì nếu bạn có những điều sau đây trong một chương trình máy tính đơn giản?

operation = ''
print("Pick an operation:  +-*/")
# Get user input here

Cố gắng nhận xét rằng với một nhận xét nhiều dòng:

/*
operation = ''
print("Pick an operation:  +-*/")
# Get user input here
*/

Rất tiếc, chuỗi của bạn chứa dấu phân cách nhận xét kết thúc.


174
Điều thú vị nhất về câu trả lời này là cách nó được xử lý bởi cú pháp tô sáng của SO.
Nietzche-jou

73
Đây là một trong nhiều lý do tại sao chúng ta có các ký tự thoát, tôi không thấy đó là lý do chính đáng để KHÔNG hỗ trợ cho các bình luận nhiều dòng.
Natalie Adams

34
Tôi không hiểu logic của bạn - có lẽ nhận xét của tôi không đủ rõ ràng. Nếu chúng tôi sử dụng \ làm ký tự thoát: print ("Chọn một thao tác: + - * \ /") "* /" không còn biểu thị một khối nhận xét kết thúc như nghĩa đen / sẽ được in. Đi trước và kiểm tra điều này trong C ++. Trong thực tế, cú pháp tô sáng của SO sẽ cho thấy điều đó là hợp lệ. Đây không phải là một chủ đề phức tạp, nó đã tồn tại nhiều năm trong các ngôn ngữ khác. Tôi sẽ yêu cầu bạn cập nhật bài đăng của mình để bao gồm việc sử dụng các ký tự thoát để cho thấy rằng bạn CÓ THỂ sử dụng "* /" trong mã của mình.
Natalie Adams

23
nếu mã của bạn chứa '' '. Rất tiếc mã của bạn chứa dấu phân cách nhận xét kết thúc
siamii

21
Nhận xét nhiều dòng vốn không dễ bị phá vỡ; hầu hết các triển khai của chúng là (bao gồm cả Python). Theo tôi, cách rõ ràng để thực hiện nhận xét nhiều dòng trong Python là chỉ để tôi bắt đầu một khối nhận xét #:và sử dụng thụt lề để hiển thị khi kết thúc nhận xét. Nó sạch sẽ, nhất quán và xử lý lồng nhau hoàn hảo.
GatesDA

34

Văn bản ba trích dẫn KHÔNG nên được coi là bình luận nhiều dòng; theo quy ước, họ docstrings . Họ nên mô tả những gì mã của bạn làm và cách sử dụng nó, nhưng không phải cho những thứ như bình luận ra các khối mã.

Theo Guido, các bình luận đa dòng trong Python chỉ là các bình luận một dòng liền kề (tìm kiếm "bình luận khối").

Để bình luận các khối mã, đôi khi tôi sử dụng mẫu sau:

if False:
    # A bunch of code

6
Có vẻ như Guido đã điều khiển tâm trí của mình kể từ đó.
Petr Viktorin

5
liên quan đến giải pháp "if false:", có một điều là trong python khi nó hoạt động với các tab, bạn phải tab trong tất cả các mã theo "if false:". Và gỡ bỏ đoạn sau đó. Vì vậy, bạn sẽ phải khá tiện lợi với trình soạn thảo văn bản của bạn.
barlop

3
nếu bạn sử dụng một trình soạn thảo đàng hoàng, thì đó sẽ là cùng một khoảng thời gian như * /
AturSams 11/03/2015

@barlop yup - tìm hiểu các biên tập viên của bạn! Điều này thường có thể đạt được trong một giây trong vim vớiV}>>
Triptych

30

Điều này có thể quay trở lại khái niệm cốt lõi rằng cần có một cách rõ ràng để thực hiện một nhiệm vụ. Phong cách bình luận bổ sung thêm các biến chứng không cần thiết và có thể làm giảm khả năng đọc.


8
Đó là vấn đề, tôi tin rằng: Sử dụng một chuỗi làm nhận xét là không rõ ràng và vi phạm nguyên tắc "một cách để thực hiện một nhiệm vụ", vì có hai cách để thực hiện nhận xét: chuỗi và #.
GatesDA

1
Nhưng nó không khác biệt đáng kể so với những gì bạn có trong các ngôn ngữ dựa trên C: / * so với //, vì vậy tôi không thấy nó tệ hơn đáng kể như thế nào.
Ben Roberts

//, Hãy xem xét TẠI SAO ai đó muốn nhận xét nhiều dòng. Những lý do chính đáng: ... Tôi thực sự không thể nghĩ ra bất kỳ điều gì ngoài "Tôi không phải gõ nhiều # doohickeys này" và "Tôi cần hiển thị nhận xét cụ thể này theo một cách rất chính xác, và cách chính xác đó không 't cho phép trước #. " Giả sử ai đó muốn thực hiện sơ đồ ASCII hoặc đặt một số mã javascript tham chiếu sẽ được sao chép và dán nếu có vấn đề cụ thể xuất hiện. Một cách rõ ràng để thực hiện một nhiệm vụ, ở đây, không bao gồm các trường hợp cạnh của nhiệm vụ đó. Tuy nhiên, tôi đồng ý rằng các kiểu nhận xét bổ sung là BAD.
Nathan Basan

3
"Tôi không phải gõ nhiều # doohickeys này". Đó là chính xác lý do tại sao khá nhiều ngôn ngữ có khối nhận xét (/ * .. * /). Dù bạn có tin hay không, nhưng tôi thích ghi lại mã của mình làm gì: đầu vào, đầu ra, thuật toán được sử dụng, các tham số ... Đó là rất nhiều văn bản cũng được sửa đổi. Hạn chế chỉ nhận xét một dòng đơn giản là vô lý. Lưu ý rằng tôi KHÔNG ủng hộ cách tiếp cận để nhận xét mã - mặc dù điều đó thường hữu ích khi thử các cách tiếp cận thay thế, miễn là hiểu được các tác dụng phụ có thể biết.
Albert Godfrind

3
Một điều khác tôi bực bội về con trăn là về cơ bản nó là ngôn ngữ được thiết kế một người. Dù Guido nói gì là sự thật ... Vì vậy, chúng ta có tất cả những sự không tương thích kỳ lạ giữa các phiên bản ngôn ngữ. Tại sao ? Bởi vì Guido đã nói như vậy ...
Albert Godfrind

12

Vâng, các trích dẫn ba được sử dụng như các bình luận đa dòng trong các tài liệu. Và # bình luận được sử dụng làm bình luận nội tuyến và mọi người sử dụng nó.

Hầu hết các ngôn ngữ script cũng không có bình luận đa dòng. Có lẽ đó là nguyên nhân?

Xem PEP 0008 , phần Nhận xét

Và xem nếu trình soạn thảo Python của bạn cung cấp một số phím tắt để nhận xét khối. Emacs hỗ trợ nó, cũng như Eclipse, có lẽ hầu hết các IDE phong nha đều có.



5

Cá nhân tôi nói phong cách nhận xét của tôi giống như Java

/*
 * My multi-line comment in Java
 */

Vì vậy, việc chỉ nhận xét một dòng không phải là một điều tồi tệ nếu phong cách của bạn là điển hình cho ví dụ trước bởi vì so sánh bạn có

#
# My multi-line comment in Python
#

VB.NET cũng là một ngôn ngữ chỉ bình luận một dòng và cá nhân tôi thấy khó chịu vì các bình luận cuối cùng trông ít lượt thích hơn bình luận và giống như một số trích dẫn

'
' This is a VB.NET example
'

Nhận xét chỉ một dòng cuối cùng có ít sử dụng ký tự hơn bình luận nhiều dòng và ít có khả năng thoát khỏi một số ký tự tinh ranh trong một tuyên bố regex có lẽ? Tôi có xu hướng đồng ý với Ned.


5

Để nhận xét một khối mã trong IDE Pycharm :

  • Mã | Bình luận với Line Comment
  • Windows hoặc Linux: Ctrl+/
  • Hệ điều hành Mac: Command+/

4
# This
# is
# a 
# multi-line
# comment

Sử dụng khối nhận xét hoặc tìm kiếm và thay thế (s / ^ / # / g) trong trình chỉnh sửa của bạn để đạt được điều này.


3

Tôi đã giải quyết điều này bằng cách tải xuống một macro cho trình soạn thảo văn bản của tôi (TextPad) cho phép tôi tô sáng các dòng và sau đó chèn # ở đầu mỗi dòng. Một macro tương tự loại bỏ các #. Một số người có thể hỏi tại sao multiline là cần thiết nhưng nó có ích khi bạn đang cố gắng "tắt" một khối mã cho mục đích gỡ lỗi.


1

Đối với bất kỳ ai khác đang tìm kiếm nhận xét nhiều dòng trong Python - sử dụng định dạng ba trích dẫn có thể có một số hậu quả có vấn đề, vì tôi vừa học được cách khó khăn. Xem xét điều này:

this_dict = {
    'name': 'Bob',

"""
This is a multiline comment in the middle of a dictionary
"""

    'species': 'Cat'
}

Nhận xét nhiều dòng sẽ được nhét vào chuỗi tiếp theo, làm rối 'species'phím. Tốt hơn là chỉ sử dụng #cho ý kiến.


0

Bởi vì quy ước # là một quy ước phổ biến và thực sự không có bất cứ điều gì bạn có thể làm với một nhận xét nhiều dòng mà bạn không thể với một nhận xét # -ign. Đó là một tai nạn lịch sử, giống như tổ tiên của các /* ... */bình luận quay trở lại PL / I,


0

Giả sử rằng họ chỉ được coi là không cần thiết. Vì thật dễ dàng để chỉ gõ #a comment, các nhận xét nhiều dòng có thể chỉ bao gồm nhiều nhận xét dòng đơn.

Mặt khác, đối với HTML , cần nhiều người hơn nữa. Thật khó để tiếp tục gõ <!--comments like this-->.


4
đây không phải là vấn đề - có những trường hợp sử dụng rõ ràng cho cả nhận xét dòng đơn và đa dòng. Tôi đã sử dụng cả hai ngôn ngữ này một cách rộng rãi (mặc dù tôi biết những người thuần túy trăn không quan tâm đến các ngôn ngữ khác). ;)
johndodo

1
Hãy thử làm điều này với 200 dòng mã, mà bạn phải lấy ra, đặt lại, sau đó lấy ra một lần nữa. Nhập 200 chữ số ban đầu sẽ nhanh cũ.
DragonLord

0

Đây chỉ là một phỏng đoán .. nhưng

Bởi vì chúng là các chuỗi, chúng có một số giá trị ngữ nghĩa (trình biên dịch không loại bỏ chúng), do đó, có ý nghĩa đối với chúng được sử dụng làm tài liệu. Chúng thực sự trở thành một phần của AST , vì vậy việc trích xuất tài liệu trở nên dễ dàng hơn.


0

Bên cạnh đó, những bình luận đa dòng là một con chó cái . Xin lỗi, nhưng bất kể ngôn ngữ nào, tôi không sử dụng chúng cho bất kỳ mục đích nào khác ngoài mục đích gỡ lỗi. Giả sử bạn có mã như thế này:

void someFunction()
{
    Something
    /*Some comments*/
    Something else
}

Sau đó, bạn phát hiện ra rằng có một cái gì đó trong mã của bạn mà bạn không thể sửa chữa với trình gỡ lỗi, vì vậy bạn bắt đầu gỡ lỗi bằng cách nhận xét các đoạn mã nhỏ hơn và nhỏ hơn với các nhận xét đa dòng. Điều này sau đó sẽ cung cấp cho chức năng:

void someFunction()
{ /*
    Something
   /* Comments */
   Something more*/
}

Điều này thực sự gây khó chịu.


3
uh tuyệt vời, nhưng Python không có /*bình luận kiểu.
Triptych

17
Đúng vậy, vì python không có nhận xét đa dòng thực sự, nó là loại ví dụ khó đưa ra trong python.
martiert

2
Cá nhân tôi không hiểu vấn đề. Chỉ cần xóa thêm * /. Hoặc sử dụng // để nhận xét các dòng đơn nếu bạn cần chính xác.
Natalie Adams

4
Có một số ngôn ngữ (nhiều trong số chúng hoạt động vì bất kỳ lý do gì) cho phép bình luận lồng nhau. Tìm kiếm "lồng nhau" trong rosettacode.org/wiki/Comments để biết ví dụ.
Keith

1
vâng, thật khó chịu khi đặt một bình luận nhiều dòng trong một bình luận nhiều dòng. Và trong khi tôi chỉ nhớ một chút về chương trình của mình tại một thời điểm, thì ít nhất tôi cũng nhớ phần nào trong chương trình của mình và tôi đã nhận xét. Nhưng nếu bạn thậm chí không thể nhớ điều đó, thì, bạn có thể sử dụng thực tế là một số IDE đưa ra chữ nghiêng là một nhận xét. Dù sao rõ ràng cho một chức năng nhỏ như vậy, bạn cũng có thể sử dụng các nhận xét dòng đơn. Nhưng nếu bình luận ra một đoạn lớn của chương trình, bạn cần một bình luận nhiều dòng thực sự. hoặc một trình soạn thảo văn bản với tính năng đó.
barlop

0

Nhận xét nhiều dòng bằng IDLE trên:

  • Mac OS X , sau khi chọn mã, nhận xét một khối mã có Ctrl+ 3và bỏ ghi chú bằng Ctrl+ 4.

  • Windows , sau khi chọn mã, nhận xét một khối mã có Ctrl+ Alt+ 3và bỏ ghi chú bằng Ctrl+ At+ 4.


-1

Tôi nhớ đã đọc về một anh chàng sẽ đưa những bình luận nhiều dòng của mình vào một biến ba trích dẫn:

x = '''
This is my
super-long mega-comment.
Wow there are a lot of lines
going on here!
'''

Điều này chiếm một chút bộ nhớ, nhưng nó cung cấp cho bạn chức năng bình luận nhiều dòng và cộng với hầu hết các biên tập viên sẽ làm nổi bật cú pháp cho bạn :)

Thật dễ dàng để nhận xét mã bằng cách chỉ cần gói nó với

x = '''

'''

18
loại bỏ x =và nó không chiếm bất kỳ bộ nhớ.
endolith
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.