รูปแบบ docstring Python มาตรฐานคืออะไร? [ปิด]


888

ฉันเคยเห็นรูปแบบการเขียนเอกสารใน Python แตกต่างกันบ้างมีสไตล์เป็นทางการหรือ "เห็นด้วย"


6
python.org/dev/peps/pep-0008มีทั้งส่วนที่เกี่ยวกับสตริงเอกสาร
mechanical_meat

30
ผมคิดว่าคำถามนี้ไม่ชัดเจนพอเพราะ PEP-257 และ PEP-8 มีการจัดตั้งเพียงฐานสำหรับ docstrings แต่วิธีการเกี่ยวกับepydoc, doxygen, sphinx? ใครบ้างมีสถิติใด ๆ เป็นหนึ่งในนั้นจะแทนที่คนอื่น ๆ ในกรณีเช่นนี้ตัวเลือกมากเกินไปอาจเจ็บ
โซริน

1
@ โซรินฉันต้องการทราบว่ามาร์กอัปคืออะไรที่พบได้บ่อยที่สุด แต่ฉันคิดว่าคำตอบคือไม่มีสิ่งใดที่เหมือนกันทั้งหมด: ผู้คนมักจะชอบที่จะดูแหล่ง Python โดยตรงแทนที่จะเปลี่ยนเป็น html ดังนั้นจึงมีประโยชน์มากที่สุดที่จะต้องมีความสอดคล้องกัน แต่ในทางที่เหมาะสำหรับการอ่านของมนุษย์และไม่มีมาร์กอัปที่ชัดเจน
poolie

3
การเติมข้อความอัตโนมัติ PyCharm ด้วยวิธีที่ค่อนข้างน่าสนใจซึ่งฉันคิดว่าเป็นการใช้งานคำแนะนำที่จำเป็นในการใช้งานได้ดี:def foo(self, other):\n\t"""\n\t(blank line)\n\t:param other: \n\t:return:\n\t"""
Matteo Ferla

1
คำตอบใดที่ตอบโดยปริยายกับตัวแยกวิเคราะห์เอกสาร VS Code?
William Entriken

คำตอบ:


1019

รูปแบบ

Python docstrings สามารถเขียนได้หลายรูปแบบตามที่โพสต์อื่นแสดงให้เห็น แต่เริ่มต้นรูปแบบ docstring สฟิงซ์ไม่ได้กล่าวถึงและอยู่บนพื้นฐานreStructuredText (ส่วนที่เหลือ) คุณสามารถรับข้อมูลเกี่ยวกับรูปแบบหลักในโพสต์บล็อกนี้

โปรดทราบว่าแนะนำโดย reep โดยPEP 287

มีดังต่อไปนี้รูปแบบที่ใช้หลักสำหรับเอกสาร

- Epytext

ในอดีตมีลักษณะเหมือนjavadocแพร่หลายดังนั้นมันจึงเป็นฐานสำหรับEpydoc (ด้วยEpytextรูปแบบที่เรียกว่า) เพื่อสร้างเอกสาร

ตัวอย่าง:

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

- reST

ปัจจุบันรูปแบบที่แพร่หลายมากขึ้นอาจเป็นรูปแบบreStructuredText (reST) ที่ใช้โดยสฟิงซ์เพื่อสร้างเอกสาร หมายเหตุ: มันถูกใช้เป็นค่าเริ่มต้นใน JetBrains PyCharm (พิมพ์เครื่องหมายคำพูดสามเท่าหลังจากกำหนดวิธีการและกด Enter) นอกจากนี้ยังใช้เป็นค่าเริ่มต้นเป็นรูปแบบเอาต์พุตใน Pyment

ตัวอย่าง:

"""
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 มีรูปแบบของตัวเองที่มักใช้ นอกจากนี้ยังสามารถตีความได้โดยสฟิงซ์ (เช่นใช้ปลั๊กอินนโปเลียน )

ตัวอย่าง:

"""
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.
"""

แม้ตัวอย่างเพิ่มเติม

- Numpydoc

โปรดทราบว่า Numpy แนะนำให้ติดตามnumpydocของตนเองตามรูปแบบของ Google และใช้งานได้โดย Sphinx

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

แปลง / ฝ่ายผลิต

เป็นไปได้ที่จะใช้เครื่องมือเช่นPymentเพื่อสร้างเอกสารโดยอัตโนมัติไปยังโครงการ Python ที่ยังไม่มีการจัดทำเป็นเอกสารหรือเพื่อแปลงเอกสารที่มีอยู่ (สามารถผสมหลายรูปแบบ) จากรูปแบบหนึ่งไปยังอีกรูปแบบหนึ่ง

หมายเหตุ: ตัวอย่างที่นำมาจากเอกสาร Pyment


10
ฉันอาจเพิ่ม reST นั้นคือสิ่งที่ใช้เป็นค่าเริ่มต้นใน JetBrains PyCharm เพียงพิมพ์เครื่องหมายคำพูดสามเท่าหลังจากกำหนดวิธีการของคุณและกด Enter jetbrains.com/pycharm/help/creating-documentation-comments.html
Felipe Almeida

12
คำตอบที่ครอบคลุมมากที่สุดรวมถึงความรู้สึกของประวัติศาสตร์และแนวปฏิบัติที่ดีที่สุดในปัจจุบัน ตอนนี้สิ่งที่เราต้องการคือความรู้สึกของการเคลื่อนไหวของชุมชนไปสู่รูปแบบ "ดีที่สุด" ใหม่และความพยายามของชุมชนเพิ่มเติมในการสร้างเครื่องมือการย้ายข้อมูลจากเครื่องมืออื่น ๆ ทั้งหมดไปสู่รูปแบบใหม่ดังนั้นเราจึงสามารถพัฒนาแนวปฏิบัติที่ดีที่สุด
BobHy

2
yo @daouzli ลิงก์สไตล์ของ google คือ 404 ฉันเชื่อว่านี่ถูกต้อง คุณสามารถเพิ่มตัวอย่างสไตล์สฟิงซ์ของ Google ได้เช่นกัน btw คำตอบที่ดี แก้ไข: ฉันแก้ไขคำตอบของคุณด้วยตัวเอง
voy

4
คำตอบที่ดี. ฉันกล้าพูดว่าคุณสามารถเปลี่ยนรูปแบบ docstring เริ่มต้นใน PyCharm (JetBrains): การตั้งค่า -> เครื่องมือ -> เครื่องมือรวม Python -> รูปแบบ Docstring โชคดี!
Jackssn

4
ฉันแปลกใจที่ไม่มีใครแสดงความคิดเห็นเกี่ยวกับบรรทัดข้อความแรก: ขณะนี้มันพูดถูกต้อง แต่ฉันรู้สึกว่าวิธีที่ต้องการคือการวางไว้ในบรรทัดแรกหลังจากคำพูดสามคำ PEP 8 และ PEP 257 ทำได้ในตัวอย่างเกือบทั้งหมด PEP 287 ทำตามวิธีของคุณ แต่จากประสบการณ์ของฉันมันไม่ธรรมดา
Lapinot

323

คู่มือสไตล์ Googleมีคู่มือสไตล์หลามที่ดีเยี่ยม มันมีข้อตกลงสำหรับไวยากรณ์ docstring ที่สามารถอ่านได้ซึ่งให้คำแนะนำที่ดีกว่า PEP-257 ตัวอย่างเช่น:

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

ฉันชอบที่จะขยายสิ่งนี้เพื่อรวมข้อมูลประเภทในอาร์กิวเมนต์ตามที่อธิบายไว้ในเอกสารประกอบการสอนของสฟิงซ์นี้ ตัวอย่างเช่น:

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

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

37
ฉันค้นหา "ลายเซ็นในเอกสาร" - สไตล์ซ้ำซ้อนและ verbose มาก สำหรับ Python 3+ การเพิ่มความคิดเห็นในฟังก์ชั่นเป็นวิธีที่ง่ายกว่ามากในการทำเช่นนี้ ยิ่งแย่ไปกว่านั้นหากใช้การหลอกแบบแข็ง: Python ดีกว่าในการพิมพ์เป็ด
Evpok

27
ใช่ แต่อย่างน้อยมันก็ให้คำใบ้ว่าเป็ดแบบไหนที่คาดหวังและ devs ส่วนใหญ่ไม่ได้อยู่ใน Python 3 เลย
Anentropic

3
@Evpok ส่วนตัวฉันไม่ชอบคำอธิบายประกอบฟังก์ชั่น ในการใช้คลาสในคลาสนั้นคุณอาจจำเป็นต้องนำเข้าที่ไม่จำเป็นเพื่อใช้สตริงในคลาสเหล่านั้นคุณอาจมีพื้นที่แนวนอนไม่เพียงพออธิบายได้อย่างรวดเร็ว จนถึงตอนนี้ฉันไม่เห็นจุดที่ใช้พวกเขาเพื่ออะไร
OdraEncoded

5
@Nathan คู่มือสไตล์ของ Google แนะนำความคิดเห็นที่เป็นคำอธิบายมากกว่าการประกาศเช่น "ดึงแถวจาก Bigtable" เหนือ "ดึงแถวจาก Bigtable" ดังนั้นการเปลี่ยน "คำนวณ ... " เป็น "คำนวณ ... " จะทำให้ตัวอย่างของคุณสอดคล้องกับความคิดเห็นที่เหลือเช่น "ส่งคืน" และ "เพิ่ม"
gwg

2
นิด: ตามสไตล์ Google ใช้คำอธิบายมากกว่ารูปแบบที่จำเป็นเช่น "คำนวณ ... " และ "เพิ่ม ... "
sbeliakov

228

ระเบียบของ Docstring อยู่ในPEP-257โดยมีรายละเอียดมากกว่า PEP-8

อย่างไรก็ตามเอกสารดูเหมือนจะเป็นส่วนตัวมากกว่าส่วนอื่น ๆ ของรหัส โครงการต่าง ๆ จะมีมาตรฐานของตนเอง

ฉันมักจะรวมถึงเอกสารเพราะพวกเขามักจะแสดงให้เห็นถึงวิธีการใช้ฟังก์ชั่นและสิ่งที่มันทำอย่างรวดเร็ว

ฉันชอบที่จะทำให้สิ่งต่าง ๆ สอดคล้องกันโดยไม่คำนึงถึงความยาวของสตริง ฉันชอบวิธีดูโค้ดเมื่อเยื้องและระยะห่างมีความสอดคล้องกัน หมายความว่าฉันใช้:

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

เกิน:

def sq(n):
    """Returns the square of n."""
    return n * 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

ฉันหมายความว่าเอกสารที่เริ่มต้นเช่นนี้ยุ่งเหยิง

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

90
โปรดทราบว่า PEP-8 บอกว่าเอกสารควรจะเขียนเป็นคำสั่ง / คำแนะนำแทนที่จะเป็นคำอธิบายเช่น มากกว่า"""Return the squared result""" """Returns the squared result"""แม้ว่าเป็นการส่วนตัวฉันเขียนของฉันว่าทิมอยู่ที่นี่ได้อย่างไรแม้ว่า PEP จะพูดว่าอย่างไร
Cam Jackson

63
ฉันยังไม่เห็นด้วยกับคำแนะนำนั้น (โดยใช้ความตึงเครียดที่จำเป็น) เพราะมันเริ่มฟังดูอึดอัดใจสำหรับสิ่งใดนานกว่าหนึ่งประโยค นอกจากนี้คุณกำลังอธิบายฟังก์ชั่นไม่บอกผู้อ่านว่าจะทำอย่างไร
mk12

14
หมายเหตุ: ข้อมูลจำเพาะสำหรับการกำหนดมากกว่าการอธิบายเอกสารจริงปรากฏในPEP-257ไม่ใช่ PEP-8 ฉันมาจากประเพณีของ Java ที่ฉันอธิบายฟังก์ชั่น แต่ในที่สุดฉันก็เริ่มใช้กาลที่จำเป็นเมื่อกระบวนทัศน์การเขียนโปรแกรมของฉันเปลี่ยนจากเชิงวัตถุเป็นขั้นตอน และเมื่อฉันเริ่มใช้pyccoเพื่อจัดทำเอกสารสไตล์การเขียนโปรแกรมมันก็เห็นได้ชัดว่าทำไมข้อเสนอแนะที่จำเป็น คุณควรเลือกตามกระบวนทัศน์ของคุณ
karan.dodia

25
ความจำเป็นเป็นไวยากรณ์อารมณ์ (ขออภัย)
เดนิสเดรสเชอร์

5
@ Mk12 ข้อความคอมมิต Git ก็ควรจะเขียนเป็นคำสั่งแทนคำอธิบาย และพวกเขายัง " อธิบาย " การเปลี่ยนรหัส "ไม่ได้บอกผู้อ่านว่าต้องทำอะไร" ดังนั้นฉันคิดว่ามันเป็นเพียงการประชุมเพื่อเขียนคำอธิบายเป็นคำสั่ง
onepiece

58

ตามที่ไม่มีใครพูดถึง: คุณสามารถใช้Numpy Docstring Standardได้เช่นกัน มันถูกใช้กันอย่างแพร่หลายในชุมชนวิทยาศาสตร์

ส่วนขยายนโปเลียนสฟิงซ์เพื่อแยกวิเคราะห์เอกสารสไตล์ Google (แนะนำในคำตอบของ @Nathan) ยังรองรับ docstring สไตล์แบบ Numpy และทำการเปรียบเทียบสั้น ๆของทั้งสอง

และสุดท้ายเป็นตัวอย่างพื้นฐานในการให้แนวคิดว่าหน้าตา:

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
รูปแบบ NumPy IMHO ใช้พื้นที่แนวตั้งมากเกินไปซึ่งหาได้ยากบนหน้าจอไวด์สกรีน (ยกเว้นคุณใช้มุมเดียวหัน 90 องศา แต่ฉันเดาว่าคนส่วนใหญ่ไม่ใช้) ดังนั้น IMHO Google Format จึงเป็นตัวเลือกที่ดีสำหรับการอ่านและคุณสมบัติ
Semanino

3
ฉันคิดว่ามันเป็นเรื่องส่วนตัว เมื่อคุณมี docstring ที่ซับซ้อนมากขึ้น (ด้วยส่วนต่าง ๆ พร้อมตัวอย่าง ฯลฯ ดังนั้นการใช้พื้นที่แนวตั้งจำนวนมากโดยไม่คำนึงถึงรูปแบบ) ฉันพบว่ารูปแบบ numpydoc นั้นง่ายต่อการอ่าน / จัดโครงสร้างที่ดีขึ้น
joris

2
โดยส่วนตัวแล้วฉันรู้สึกว่า docstring ที่มีความยาวอยู่ในเอกสารไม่ใช่ซอร์สโค้ดถ้ามันยาวมากมันจะขัดขวางการอ่านของโมดูล
Jonathan Hartley

12

PEP-8เป็นมาตรฐานการเข้ารหัสของไพ ธ อน มันมีส่วนเกี่ยวกับเอกสารซึ่งหมายถึงPEP-257 - ข้อกำหนดที่สมบูรณ์สำหรับเอกสาร


8
การกล่าวถึง PEP-257 ในบริบทของ "ฉันควรทำเอกสารพารามิเตอร์อย่างถูกต้อง, ส่งคืนค่า, ยกข้อยกเว้น ฯลฯ " เป็น JOKE - มันบอกว่าไม่ใช่คำเดียวเกี่ยวกับพวกเขา (แม้ว่าตัวอย่างรหัสจะแสดงบางส่วน) IMHO Google Format เป็นตัวเลือกที่ดีเกี่ยวกับความสามารถในการอ่านและคุณสมบัติ
Semanino

9

มันคือ Python อะไรไป พิจารณาวิธีการเผยแพร่เอกสารของคุณ เอกสารมองไม่เห็นยกเว้นผู้อ่านรหัสต้นฉบับของคุณ

คนชอบเรียกดูและค้นหาเอกสารบนเว็บ เพื่อให้บรรลุว่าใช้เครื่องมือเอกสารสฟิงซ์ เป็นมาตรฐานที่แท้จริงสำหรับการบันทึกโครงการ Python สินค้าที่มีความสวยงาม - ใช้เวลาดูที่https://python-guide.readthedocs.org/en/latest/ เว็บไซต์อ่านเอกสารจะโฮสต์เอกสารของคุณฟรี


22
ฉันใช้ipythonทดสอบไดรฟ์ไลบรารีเป็นประจำและทำให้การอ่านเอกสารง่ายมาก - ทั้งหมดที่ฉันต้องพิมพ์คือyour_module.some_method_im_curious_about?และฉันได้งานพิมพ์ที่ดีทุกอย่างรวมถึง docstring
Thanatos

8
ผู้ใช้ไลบรารีหรือAPIหรือผู้ที่เขียนปลั๊กอินมีแนวโน้มที่จะดูรหัสและจำเป็นต้องเข้าใจมัน ฉันพบความคิดเห็นที่สำคัญยิ่งกว่าใน Python มากกว่าใน Java หรือ C # เนื่องจากไม่มีการประกาศประเภท มันช่วยได้มากหากความคิดเห็นแสดงความคิดเห็นว่าเป็ดชนิดใดที่ถูกส่งผ่านและส่งคืน (ไม่เช่นนั้นคุณต้องเดินตามรหัสทั้งหมดและนับว่าพารามิเตอร์ที่กำหนดต้อง ... สามารถทำซ้ำได้ที่นี่ ... รองรับการทำดัชนีที่นั่น ... สนับสนุนการลบตัวเลขในตอนท้าย ... Aha! int array ความคิดเห็นจะช่วยได้!)
Jon Coombs

เอ๊ะไม่ Docstrings นั้นมองไม่เห็นและนั่นเป็นประเด็นสำคัญ คุณจะเห็น docstring ถ้าคุณเรียกใช้helpฟังก์ชันบน function / method / class ที่ทำเป็นเอกสาร (และคุณสามารถทำได้แม้ว่าคุณจะสามารถเข้าถึงโมดูลที่คอมไพล์แล้วเท่านั้น) โดยส่วนตัวฉันคิดว่าควรเก็บไว้ในใจเมื่อเลือกการประชุม docstring (เช่นว่ามันตั้งใจที่จะอ่านตามที่เป็นอยู่)
skyking

7

ฉันแนะนำให้ใช้โปรแกรมpep257 Python ของ Vladimir Keleshev เพื่อตรวจสอบ docstrings ของคุณกับPEP-257และNumpy Docstring Standardเพื่ออธิบายพารามิเตอร์ผลตอบแทน ฯลฯ

pep257 จะรายงานความแตกต่างที่คุณทำจากมาตรฐานและเรียกว่าเช่น pylint และ pep8


การกล่าวถึง PEP-257 ในบริบทของ "ฉันควรทำเอกสารพารามิเตอร์อย่างถูกต้อง, ส่งคืนค่า, ยกข้อยกเว้น ฯลฯ " เป็น JOKE - มันบอกว่าไม่ใช่คำเดียวเกี่ยวกับพวกเขา (แม้ว่าตัวอย่างรหัสจะแสดงบางส่วน) รูปแบบ NumPy IMHO ใช้พื้นที่แนวตั้งมากเกินไปซึ่งหาได้ยากบนหน้าจอไวด์สกรีน (ยกเว้นคุณใช้มุมเดียวหัน 90 องศา แต่ฉันเดาว่าคนส่วนใหญ่ไม่ใช้) ดังนั้น IMHO Google Format จึงเป็นตัวเลือกที่ดีสำหรับการอ่านและคุณสมบัติ
Semanino

1
@Semanino ฉันกำลังพูดถึง Numpy Docstring Standard ในบริบทของโปรแกรม pep257 ไม่ใช่ PEP-257 โปรแกรมนั้นเรียกว่า pydocstyle pydocstyle ช่วยให้คุณทำการตรวจสอบ numpydoc บางอย่างเช่นการpydocstyle --select=D4 tmp.pyตรวจสอบช่วงของปัญหาเนื้อหา docstring รวมถึงการตั้งชื่อส่วน
ฟินน์Årup Nielsen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.