Định dạng chuỗi tiêu chuẩn Python là gì? [đóng cửa]


888

Tôi đã thấy một vài phong cách viết tài liệu khác nhau trong Python, đó là một phong cách chính thức hay "đồng ý"?


6
python.org/dev/peps/pep-0008 có cả một phần dành cho các chuỗi tài liệu
Mechanical_meat

30
Tôi nghĩ rằng câu hỏi này là không đủ rõ ràng vì PEP-257 và PEP-8 là những thiết lập chỉ cơ sở cho docstrings, nhưng làm thế nào về epydoc, doxygen, sphinx? Có ai có bất kỳ số liệu thống kê, là một trong số họ sẽ thay thế những người khác, trong trường hợp như thế này quá nhiều lựa chọn có thể làm tổn thương.
sorin

1
@sorin, tôi cũng muốn biết đánh dấu gì, nếu có, là phổ biến nhất. Nhưng tôi nghĩ câu trả lời là không ai trong số họ thực sự phổ biến: mọi người có xu hướng thích nhìn trực tiếp vào nguồn Python hơn là chuyển đổi sang html. Vì vậy, hữu ích nhất là chỉ nhất quán nhưng theo cách được tối ưu hóa cho khả năng đọc của con người và không có đánh dấu rõ ràng.
poolie

3
Tự động hoàn thành PyCharm theo một cách khá thú vị, mà tôi nghĩ là một cách thực hiện tốt các hướng dẫn cần thiết để chạy nó:def foo(self, other):\n\t"""\n\t(blank line)\n\t:param other: \n\t:return:\n\t"""
Matteo Ferla

1
Câu trả lời nào là câu trả lời hoạt động theo mặc định với trình phân tích cú pháp tài liệu VS Code?
William Entriken

Câu trả lời:


1019

Các định dạng

Tài liệu Python có thể được viết theo một số định dạng như các bài viết khác cho thấy. Tuy nhiên, định dạng chuỗi Sphinx mặc định không được đề cập và dựa trên reSturationuredText (reST) . Bạn có thể nhận được một số thông tin về các định dạng chính trong bài đăng trên blog này .

Lưu ý rằng reST được khuyến nghị bởi PEP 287

Có các định dạng được sử dụng chính cho các tài liệu.

- Epytext

Trong lịch sử, một phong cách giống như javadoc là phổ biến, do đó, nó được lấy làm cơ sở cho Epydoc (với Epytextđịnh dạng được gọi ) để tạo tài liệu.

Thí dụ:

"""
This is a javadoc style.

@param param1: this is a first param
@param param2: this is a second param
@return: this is a description of what is returned
@raise keyError: raises an exception
"""

- nghỉ ngơi

Ngày nay, các định dạng có thể phổ biến hơn là reStructuredText (phần còn lại) định dạng được sử dụng bởi Sphinx để tạo ra tài liệu. Lưu ý: nó được sử dụng theo mặc định trong JetBrains PyCharm (nhập ba dấu ngoặc kép sau khi xác định phương thức và nhấn enter). Nó cũng được sử dụng theo mặc định như định dạng đầu ra trong Pyment.

Thí dụ:

"""
This is a reST style.

:param param1: this is a first param
:param param2: this is a second param
:returns: this is a description of what is returned
:raises keyError: raises an exception
"""

- Google

Google có định dạng riêng thường được sử dụng. Nó cũng có thể được giải thích bởi Sphinx (tức là sử dụng plugin Napoleon ).

Thí dụ:

"""
This is an example of Google style.

Args:
    param1: This is the first param.
    param2: This is a second param.

Returns:
    This is a description of what is returned.

Raises:
    KeyError: Raises an exception.
"""

Thậm chí nhiều ví dụ

- Numpydoc

Lưu ý rằng Numpy khuyên bạn nên theo Numpydoc của riêng họ dựa trên định dạng của Google và Sphinx có thể sử dụng được.

"""
My numpydoc description of a kind
of very exhautive numpydoc format docstring.

Parameters
----------
first : array_like
    the 1st param name `first`
second :
    the 2nd param
third : {'value', 'other'}, optional
    the 3rd param, by default 'value'

Returns
-------
string
    a value in a string

Raises
------
KeyError
    when a key error
OtherError
    when an other error
"""

Chuyển đổi / tạo

Có thể sử dụng một công cụ như Pyment để tự động tạo tài liệu cho dự án Python chưa được ghi lại hoặc để chuyển đổi các tài liệu hiện có (có thể trộn một số định dạng) từ định dạng sang định dạng khác.

Lưu ý: Các ví dụ được lấy từ tài liệu Pyment


10
Tôi có thể thêm rằng reST là những gì được sử dụng theo mặc định trong JetBrains PyCharm, Chỉ cần nhập ba dấu ngoặc kép sau khi xác định phương thức của bạn và nhấn enter. jetbrains.com/pycharm/help/creating-documentation-comments.html
Felipe Almeida

12
Câu trả lời toàn diện nhất, bao gồm ý thức về lịch sử và thực tiễn tốt nhất hiện tại. Bây giờ tất cả những gì chúng ta cần là một số ý nghĩa của chuyển động cộng đồng đối với một định dạng "tốt nhất" mới và một số nỗ lực cộng đồng bổ sung để tạo ra các công cụ di chuyển từ tất cả các công cụ khác, vì vậy chúng ta thực sự có thể phát triển thực tiễn tốt nhất.
BobHy

2
yo @daouzli, liên kết kiểu google là 404. Tôi tin rằng điều này là chính xác. Bạn có thể thêm ví dụ phong cách google nhân sư là tốt. Câu trả lời tuyệt vời btw. EDIT: Tôi tự chỉnh sửa câu trả lời của bạn.
Voy

4
câu trả lời tốt. Tôi dám nói nơi bạn có thể thay đổi định dạng chuỗi mặc định trong PyCharm (JetBrains): Cài đặt -> Công cụ -> Công cụ tích hợp Python -> Định dạng chuỗi. Chúc may mắn!
Jackssn

4
Tôi ngạc nhiên khi không ai bình luận về dòng văn bản đầu tiên: hiện tại nó nói đúng nhưng tôi cảm thấy như cách ưa thích là đặt nó trên dòng đầu tiên chỉ sau ba dấu ngoặc kép. PEP 8 và PEP 257 thực hiện nó trong hầu hết các ví dụ của họ. PEP 287 thực hiện theo cách của bạn, nhưng theo kinh nghiệm của tôi thì nó không phổ biến.
Lapinot

323

Các hướng dẫn phong cách Google chứa một hướng dẫn phong cách tuyệt vời Python. Nó bao gồm các quy ước cho cú pháp chuỗi có thể đọc được cung cấp hướng dẫn tốt hơn PEP-257. Ví dụ:

def square_root(n):
    """Calculate the square root of a number.

    Args:
        n: the number to get the square root of.
    Returns:
        the square root of n.
    Raises:
        TypeError: if n is not a number.
        ValueError: if n is negative.

    """
    pass

Tôi muốn mở rộng điều này để bao gồm thông tin loại trong các đối số, như được mô tả trong hướng dẫn tài liệu Nhân sư này . Ví dụ:

def add_value(self, value):
    """Add a new value.

       Args:
           value (str): the value to add.
    """
    pass

37
Tôi tìm thấy "chữ ký trong các tài liệu" - phong cách cực kỳ dư thừa và dài dòng. Đối với Python 3+, chú thích hàm là một cách sạch hơn để làm điều này. Thậm chí tệ hơn nếu nó sử dụng các loại giả mạnh: Python tốt hơn với cách gõ vịt.
Evpok

27
vâng, nhưng ít nhất nó cũng đưa ra gợi ý về loại vịt nào được mong đợi và phần lớn các nhà phát triển chưa có trên Python 3
Anentropic

3
@Evpok cá nhân, tôi không thích chú thích chức năng. Để sử dụng các lớp trong chúng, bạn có thể phải thực hiện nhập không cần thiết, để sử dụng các chuỗi trong chúng, bạn có thể chạy ra khỏi không gian ngang rất nhanh khi mô tả chúng. Cho đến nay tôi chưa thấy quan điểm sử dụng chúng cho bất cứ điều gì.
OdraEncoding

5
@Nathan, hướng dẫn về phong cách của Google khuyến nghị các nhận xét mang tính mô tả thay vì khai báo, ví dụ: "Tìm nạp các hàng từ Bigtable" qua "Tìm nạp các hàng từ Bigtable". Do đó, việc thay đổi "Tính toán ..." thành "Tính toán ..." sẽ làm cho ví dụ của bạn phù hợp hơn với phần còn lại của nhận xét, tức là "Trả về" và "Tăng".
gwg

2
nit: Theo phong cách Google, sử dụng mô tả thay vì hình thức bắt buộc, nghĩa là "Tính toán ..." và "Thêm ..."
sbeliakov

228

Các quy ước về chuỗi trong PEP-257 với nhiều chi tiết hơn PEP-8.

Tuy nhiên, các tài liệu dường như mang tính cá nhân hơn nhiều so với các lĩnh vực mã khác. Các dự án khác nhau sẽ có tiêu chuẩn riêng của họ.

Tôi có xu hướng luôn luôn bao gồm các tài liệu, bởi vì chúng có xu hướng thể hiện cách sử dụng chức năng và những gì nó làm rất nhanh.

Tôi thích giữ mọi thứ nhất quán, bất kể độ dài của chuỗi. Tôi thích làm thế nào để mã trông khi thụt lề và khoảng cách là nhất quán. Điều đó có nghĩa là, tôi sử dụng:

def sq(n):
    """
    Return the square of n. 
    """
    return n * n

Kết thúc:

def sq(n):
    """Returns the square of n."""
    return n * n

Và có xu hướng bỏ bình luận về dòng đầu tiên trong các tài liệu dài hơn:

def sq(n):
    """
    Return the square of n, accepting all numeric types:

    >>> sq(10)
    100

    >>> sq(10.434)
    108.86835599999999

    Raises a TypeError when input is invalid:

    >>> sq(4*'435')
    Traceback (most recent call last):
      ...
    TypeError: can't multiply sequence by non-int of type 'str'

    """
    return n*n

Có nghĩa là tôi thấy các tài liệu bắt đầu như thế này là lộn xộn.

def sq(n):
    """Return the squared result. 
    ...

90
Lưu ý rằng PEP-8 đặc biệt nói rằng các tài liệu nên được viết dưới dạng lệnh / hướng dẫn, thay vì mô tả, ví dụ. """Return the squared result"""hơn """Returns the squared result""". Mặc dù cá nhân, tôi viết cho tôi cách Tim ở đây, bất chấp những gì PEP nói.
Cam Jackson

63
Tôi cũng không đồng ý với lời khuyên đó (sử dụng thì bắt buộc) bởi vì nó bắt đầu nghe có vẻ khó xử cho bất cứ điều gì dài hơn một câu. Hơn nữa, bạn đang mô tả một chức năng, không cho người đọc biết phải làm gì.
mk12

14
Lưu ý: Thông số kỹ thuật cho các tài liệu mô tả thay vì mô tả thực sự xuất hiện trong PEP-257 , không phải PEP-8. Tôi đã đến từ một truyền thống của Java, nơi tôi đã mô tả các hàm, nhưng cuối cùng tôi đã bắt đầu sử dụng thì bắt buộc khi mô hình lập trình của tôi chuyển từ hướng đối tượng sang thủ tục. Và khi tôi bắt đầu sử dụng pycco để tạo tài liệu theo kiểu lập trình biết chữ, nó trở nên rất rõ ràng tại sao các thì bắt buộc được đề xuất. Bạn nên chọn dựa trên mô hình của bạn.
karan.dodia

26
Điều bắt buộc là một tâm trạng ngữ pháp . (Xin lỗi.)
Denis Lagcher

5
@ Mk12 Git thông điệp cam kết cũng nên được viết dưới dạng lệnh thay vì mô tả. Và họ cũng đang " mô tả " một sự thay đổi mã, "không cho người đọc biết phải làm gì". Vì vậy, tôi nghĩ rằng nó chỉ là quy ước để viết mô tả như các lệnh.
onepiece

58

Như một cách thận trọng, không ai đề cập đến nó: bạn cũng có thể sử dụng Tiêu chuẩn Chuỗi Numpy . Nó được sử dụng rộng rãi trong cộng đồng khoa học.

Tiện ích mở rộng nhân sư Napolean để phân tích các tài liệu kiểu Google (được đề xuất trong câu trả lời của @Nathan) cũng hỗ trợ chuỗi tài liệu theo kiểu Numpy và so sánh ngắn cả hai.

Và cuối cùng là một ví dụ cơ bản để đưa ra một ý tưởng như thế nào:

def func(arg1, arg2):
    """Summary line.

    Extended description of function.

    Parameters
    ----------
    arg1 : int
        Description of arg1
    arg2 : str
        Description of arg2

    Returns
    -------
    bool
        Description of return value

    See Also
    --------
    otherfunc : some related other function

    Examples
    --------
    These are written in doctest format, and should illustrate how to
    use the function.

    >>> a=[1,2,3]
    >>> print [x + 3 for x in a]
    [4, 5, 6]
    """
    return True

2
Định dạng NumPy IMHO chiếm quá nhiều không gian theo chiều dọc, khan hiếm trên màn hình rộng (ngoại trừ bạn sử dụng một góc quay 90 độ, nhưng tôi đoán hầu hết mọi người không) Vì vậy, IMHO Google Format là một lựa chọn tốt về khả năng đọc và tính năng.
Semanino

3
Tôi cho rằng nó hơi chủ quan. Khi bạn có một chuỗi doc phức tạp hơn (với các phần khác nhau, với các ví dụ, v.v., vì vậy dù sao cũng có nhiều không gian theo chiều dọc bất kể định dạng nào), tôi thấy định dạng numpydoc dễ đọc / có cấu trúc tốt hơn.
joris

2
Cá nhân tôi cảm thấy một chuỗi dài như vậy nằm trong tài liệu tốt hơn, không phải là mã nguồn, nếu quá lâu chúng sẽ cản trở khả năng đọc của mô-đun.
Jonathan Hartley

12

PEP-8 là tiêu chuẩn mã hóa python chính thức. Nó chứa một phần về các tài liệu, trong đó đề cập đến PEP-257 - một đặc điểm kỹ thuật hoàn chỉnh cho các tài liệu.


8
Đề cập đến PEP-257 trong ngữ cảnh "làm thế nào tôi nên ghi lại đúng các tham số, trả về giá trị, ngoại lệ được nêu ra ..." là một CÔNG CỤ - nó không nói một từ nào về chúng (mặc dù một ví dụ mã cho thấy một số). IMHO Google Format là một lựa chọn tốt liên quan đến khả năng đọc và các tính năng.
Semanino

9

Đó là Python; bất cứ điều gì đi . Xem xét làm thế nào để xuất bản tài liệu của bạn . Tài liệu là vô hình ngoại trừ độc giả của mã nguồn của bạn.

Mọi người thực sự thích duyệt và tìm kiếm tài liệu trên web. Để đạt được điều đó, hãy sử dụng công cụ tài liệu Sphinx . Đó là tiêu chuẩn thực tế để ghi lại các dự án Python. Sản phẩm này rất đẹp - hãy xem https://python-guide.readthedocs.org/en/latest/ . Trang web Đọc Tài liệu sẽ lưu trữ tài liệu của bạn miễn phí.


22
Tôi thường xuyên sử dụng ipythonđể lái thử một thư viện và nó làm cho việc đọc các tài liệu trở nên đơn giản - tất cả những gì tôi phải gõ là your_module.some_method_im_curious_about?và tôi nhận được mọi bản in đẹp, bao gồm cả chuỗi.
Thanatos

8
Người dùng của thư viện hoặc API hoặc người đang viết plugin đều có khả năng xem mã và cần hiểu ý nghĩa của nó. Tôi thấy các bình luận quan trọng hơn nhiều trong Python so với Java hoặc C # vì các kiểu không được khai báo. Nó giúp ích rất nhiều nếu các ý kiến ​​đưa ra ý tưởng về những loại vịt nào được thông qua và trả lại. (Nếu không, bạn phải thực sự đi hết mã và kiểm tra xem một tham số đã cho phải ... có thể lặp lại ở đây ... hỗ trợ lập chỉ mục ở đó ... hỗ trợ phép trừ số ở cuối ... int mảng. Một nhận xét sẽ có ích!)
Jon Coombs

Ơ, không. Tài liệu không phải là vô hình và đó là một chút điểm. Bạn có thể thấy chuỗi doc nếu bạn chạy helphàm trên hàm / phương thức / lớp được ghi lại (và bạn có thể làm được ngay cả khi bạn chỉ có quyền truy cập vào mô-đun đã biên dịch). Cá nhân tôi nghĩ rằng người ta nên ghi nhớ điều này khi chọn quy ước chuỗi (nghĩa là nó có ý định được đọc như hiện tại).
bầu trời

7

Tôi đề nghị sử dụng Vladimir Keleshev của pep257 chương trình Python để kiểm tra docstrings của bạn chống lại PEP-257docstring Chuẩn NumPy để mô tả các thông số, lợi nhuận, vv

pep257 sẽ báo cáo phân kỳ bạn thực hiện từ tiêu chuẩn và được gọi là pylint và pep8.


Đề cập đến PEP-257 trong ngữ cảnh "làm thế nào tôi nên ghi lại đúng các tham số, trả về giá trị, ngoại lệ được nêu ra ..." là một CÔNG CỤ - nó không nói một từ nào về chúng (mặc dù một ví dụ mã cho thấy một số). Định dạng NumPy IMHO chiếm quá nhiều không gian theo chiều dọc, khan hiếm trên màn hình rộng (ngoại trừ bạn sử dụng một góc quay 90 độ, nhưng tôi đoán hầu hết mọi người không) Vì vậy, IMHO Google Format là một lựa chọn tốt về khả năng đọc và tính năng.
Semanino

1
@Semanino Tôi đang đề cập đến Tiêu chuẩn Chuỗi Numpy trong bối cảnh chương trình pep257, - không phải PEP-257. Chương trình đó bây giờ được gọi là pydocstyle. pydocstyle cho phép bạn thực hiện một số kiểm tra numpydoc, ví dụ: pydocstyle --select=D4 tmp.pykiểm tra một loạt các vấn đề nội dung chuỗi bao gồm cả việc đặt tên phần.
Finn Årup Nielsen
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.