Làm thế nào để ghi lại một phương thức với (các) tham số?


139

Làm cách nào để ghi lại các phương thức với các tham số bằng chuỗi tài liệu của Python?

EDIT: PEP 257 đưa ra ví dụ này:

def complex(real=0.0, imag=0.0):
    """Form a complex number.

    Keyword arguments:
    real -- the real part (default 0.0)
    imag -- the imaginary part (default 0.0)

    """
    if imag == 0.0 and real == 0.0: return complex_zero
    ...

Đây có phải là quy ước được sử dụng bởi hầu hết các nhà phát triển Python?

Keyword arguments:
<parameter name> -- Definition (default value if any)

Tôi đã mong đợi một cái gì đó trang trọng hơn một chút như

def complex(real=0.0, imag=0.0):
    """Form a complex number.

    @param: real The real part (default 0.0)
    @param: imag The imaginary part (default 0.0)

    """
    if imag == 0.0 and real == 0.0: return complex_zero
    ...

Môi trường : Python 2.7.1


1
Bạn đã đọc PEP 257 chưa? python.org/dev/peps/pep-0257
NPE

1
Có một số "tiêu chuẩn" ngoài kia nhưng về cách tiếp cận thực tế và đặc biệt nếu bạn thích một cái gì đó trang trọng, tôi muốn giới thiệu nhân sư . Sự tích hợp của nó trong Pycharm làm cho việc tạo ra các tài liệu có cấu trúc tốt khá đau đớn. IMHO
jojo

Câu trả lời:


86

Dựa trên kinh nghiệm của tôi, các công ước docstring NumPy (PEP257 superset) là rộng rãi nhất lây lan theo công ước đó cũng được hỗ trợ bởi các công cụ, chẳng hạn như Sphinx .

Một ví dụ:

Parameters
----------
x : type
    Description of parameter `x`.

2
Điều này gần hơn với những gì tôi mong đợi. Thật không may, tôi đã chọn PEP 257 đơn giản và thêm quy ước của riêng mình (với chi phí mất tài liệu HTML / PDF được tự tạo). Tuy nhiên, lần sau, tôi sẽ chọn giải pháp này. Cảm ơn.
David Andreoletti

5
Khi tôi cố gắng xử lý chuỗi đề xuất của bạn, Sphinx phàn nàn SEVERE: Unexpected section title- bạn có biết cách nào để Sphinx vui hơn về nó không?
Brandon Rhodes

@BrandonRhodes liên kết này nói về việc sử dụng các quy ước này với Sphinx: github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt
Vladimir Keleshev

3
Thực tế có một không gian bị thiếu trước đây Description. Tôi đã kiểm tra tài liệu khó hiểu, bởi vì tôi ngay lập tức chú ý và nghĩ "Đợi một chút, tại sao lại là ba khoảng trắng? Thật kỳ lạ. Ai sẽ sử dụng ba khoảng trắng?"
Zelphir Kaltstahl

6
Đây có thể là câu trả lời tốt nhất tại thời điểm câu hỏi được hỏi, nhưng tôi nghĩ đến bây giờ (cuối năm 2017), Sphinx đã nổi lên chiến thắng.
Alex L

120

Vì các tài liệu ở dạng tự do, nên nó thực sự phụ thuộc vào những gì bạn sử dụng để phân tích mã để tạo tài liệu API.

Tôi khuyên bạn nên làm quen với đánh dấu Sphinx , vì nó được sử dụng rộng rãi và đang trở thành tiêu chuẩn thực tế để ghi lại các dự án Python, một phần vì dịch vụ readthedocs.org tuyệt vời . Để diễn giải một ví dụ từ tài liệu Sphinx dưới dạng đoạn mã Python:

def send_message(sender, recipient, message_body, priority=1):
   '''
   Send a message to a recipient

   :param str sender: The person sending the message
   :param str recipient: The recipient of the message
   :param str message_body: The body of the message
   :param priority: The priority of the message, can be a number 1-5
   :type priority: integer or None
   :return: the message id
   :rtype: int
   :raises ValueError: if the message_body exceeds 160 characters
   :raises TypeError: if the message_body is not a basestring
   '''

Đánh dấu này hỗ trợ tham chiếu chéo giữa các tài liệu và nhiều hơn nữa. Lưu ý rằng tài liệu Sphinx sử dụng (ví dụ) :py:attr:trong khi bạn chỉ có thể sử dụng :attr:khi ghi lại từ mã nguồn.

Đương nhiên, có các công cụ khác để ghi lại API. Có Doxygen cổ điển hơn sử dụng \param các lệnh nhưng chúng không được thiết kế đặc biệt để ghi lại mã Python như Sphinx.

Lưu ý rằng có một câu hỏi tương tự với câu trả lời tương tự ở đây ...


9
Đây là kiểu được sử dụng theo tự động nhận xét của PyCharm theo mặc định
Josiah Yoder

Điều gì về cú pháp của các loại hỗn hợp như danh sách các công cụ?
matanster

Sau đó, nó là một list.
Anarcat

33

Công ước:

Công cụ:


Cập nhật: Vì Python 3.5, bạn có thể sử dụng các gợi ý loại là cú pháp nhỏ gọn, dễ đọc bằng máy:

from typing import Dict, Union

def foo(i: int, d: Dict[str, Union[str, int]]) -> int:
    """
    Explanation: this function takes two arguments: `i` and `d`.
    `i` is annotated simply as `int`. `d` is a dictionary with `str` keys
    and values that can be either `str` or `int`.

    The return type is `int`.

    """

Ưu điểm chính của cú pháp này là nó được xác định bởi ngôn ngữ và nó không rõ ràng, vì vậy các công cụ như PyCharm có thể dễ dàng tận dụng lợi thế của nó.


12
Mặc dù câu trả lời này hiện được đánh giá cao nhất, nhưng cả PEP ở trên không cung cấp quy ước để chỉ định các loại đối số của phương thức.
rau mùi

11

chuỗi python doc là dạng tự do , bạn có thể ghi lại nó theo bất kỳ cách nào bạn muốn.

Ví dụ:

def mymethod(self, foo, bars):
    """
    Does neat stuff!
    Parameters:
      foo - a foo of type FooType to bar with.
      bars - The list of bars
    """

Bây giờ, có một số quy ước, nhưng python không thi hành bất kỳ trong số chúng. Một số dự án có quy ước riêng của họ. Một số công cụ để làm việc với các tài liệu cũng tuân theo các quy ước cụ thể.



3

Dòng chính là, như các câu trả lời khác ở đây đã chỉ ra, có thể đi theo cách Sphinx để bạn có thể sử dụng Sphinx để tạo các tài liệu ưa thích đó sau này.

Điều đó đang được nói, cá nhân tôi thỉnh thoảng đi với phong cách bình luận nội tuyến.

def complex(  # Form a complex number
        real=0.0,  # the real part (default 0.0)
        imag=0.0  # the imaginary part (default 0.0)
        ):  # Returns a complex number.
    """Form a complex number.

    I may still use the mainstream docstring notation,
    if I foresee a need to use some other tools
    to generate an HTML online doc later
    """
    if imag == 0.0 and real == 0.0:
        return complex_zero
    other_code()

Một ví dụ nữa ở đây, với một số chi tiết nhỏ được ghi lại trong dòng:

def foo(  # Note that how I use the parenthesis rather than backslash "\"
          # to natually break the function definition into multiple lines.
        a_very_long_parameter_name,
            # The "inline" text does not really have to be at same line,
            # when your parameter name is very long.
            # Besides, you can use this way to have multiple lines doc too.
            # The one extra level indentation here natually matches the
            # original Python indentation style.
            #
            # This parameter represents blah blah
            # blah blah
            # blah blah
        param_b,  # Some description about parameter B.
            # Some more description about parameter B.
            # As you probably noticed, the vertical alignment of pound sign
            # is less a concern IMHO, as long as your docs are intuitively
            # readable.
        last_param,  # As a side note, you can use an optional comma for
                     # your last parameter, as you can do in multi-line list
                     # or dict declaration.
        ):  # So this ending parenthesis occupying its own line provides a
            # perfect chance to use inline doc to document the return value,
            # despite of its unhappy face appearance. :)
    pass

Những lợi ích (như @ mark-horvath đã chỉ ra trong một bình luận khác) là:

  • Quan trọng nhất, các tham số và tài liệu của chúng luôn ở cùng nhau, mang lại những lợi ích sau:
  • Gõ ít hơn (không cần lặp lại tên biến)
  • Bảo trì dễ dàng hơn khi thay đổi / loại bỏ biến. Sẽ không bao giờ có một đoạn doc tham số mồ côi sau khi bạn đổi tên một số tham số.
  • và dễ dàng hơn để tìm thấy bình luận bị thiếu.

Bây giờ, một số người có thể nghĩ rằng phong cách này trông "xấu xí". Nhưng tôi sẽ nói "xấu xí" là một từ chủ quan. Một cách trung lập hơn để nói, phong cách này không phải là chủ đạo nên nó có thể trông ít quen thuộc hơn với bạn, do đó ít thoải mái hơn. Một lần nữa, "thoải mái" cũng là một từ chủ quan. Nhưng vấn đề là, tất cả những lợi ích được mô tả ở trên là khách quan. Bạn không thể đạt được chúng nếu bạn làm theo cách tiêu chuẩn.

Hy vọng một ngày nào đó trong tương lai, sẽ có một công cụ tạo tài liệu cũng có thể sử dụng kiểu nội tuyến như vậy. Điều đó sẽ thúc đẩy việc áp dụng.

PS: Câu trả lời này bắt nguồn từ sở thích sử dụng bình luận nội tuyến của tôi bất cứ khi nào tôi thấy phù hợp. Tôi sử dụng cùng một kiểu nội tuyến để ghi lại một từ điển .


1

Dựa trên câu trả lời gợi ý loại ( https://stackoverflow.com/a/9195565/2418922 ), cung cấp một cách có cấu trúc tốt hơn để ghi lại các loại tham số, cũng tồn tại một cách có cấu trúc để ghi lại cả loại và mô tả tham số:

def copy_net(
    infile: (str, 'The name of the file to send'),
    host: (str, 'The host to send the file to'),
    port: (int, 'The port to connect to')):

    pass

ví dụ được thông qua từ: https://pypi.org/project/autocommand/


1
Đây có phải là một cú pháp chính thức? Nó siêu hữu ích, tuy nhiên tôi không thể tìm thấy nó trong các tài liệu / PEP chính thức ...
Ofri Raviv

1
Tôi cũng muốn biết điều đó, nếu có PEP cho nó.
DreamFlasher

-1

Tài liệu chỉ hữu ích trong môi trường tương tác, ví dụ trình bao Python. Khi ghi lại các đối tượng sẽ không được sử dụng tương tác (ví dụ: các đối tượng bên trong, các cuộc gọi lại khung), bạn cũng có thể sử dụng các nhận xét thông thường. Đây là một phong cách tôi sử dụng để treo các bình luận thụt vào các mục, mỗi mục trên dòng riêng của chúng, để bạn biết rằng nhận xét đó được áp dụng cho:

def Recomputate \
  (
    TheRotaryGyrator,
      # the rotary gyrator to operate on
    Computrons,
      # the computrons to perform the recomputation with
    Forthwith,
      # whether to recomputate forthwith or at one's leisure
  ) :
  # recomputates the specified rotary gyrator with
  # the desired computrons.
  ...
#end Recomputate

Bạn không thể làm điều này với các tài liệu.


46
Ồ, cái này trông xấu xí.
Misha Akovantsev

1
Xấu có đúng không? Ý tưởng thú vị ... cũng có.
David

2
Nhận xét nội tuyến cho các biến rất hợp lý, ít gõ (không cần lặp lại tên biến), bảo trì dễ dàng hơn khi thay đổi / xóa biến ... dễ dàng tìm thấy bình luận bị thiếu. Sẽ kết hợp nó với doc Chuỗi thích hợp bên dưới chữ ký. +1
Đánh dấu Horvath

Điều đó không làm việc như tài liệu. Nếu bạn nhận xét gói của bạn như thế này và người dùng PyCharm tải xuống, họ sẽ không thể kiểm tra từng thông số mà không cần truy cập tài liệu của bạn - thứ mà bạn sẽ không thể tạo với bất kỳ phần mềm nào. Trừ khi bạn làm cho riêng mình. Đó là lý do tại sao OP yêu cầu chỉ định nó trong doc Chuỗi. Xin lỗi muộn quá.

Điều này thật kinh khủng.
Michael Walters
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.