จะใช้ autodoc ของ Sphinx เพื่อบันทึกวิธี __init __ (self) ของคลาสได้อย่างไร


107

Sphinx ไม่สร้างเอกสารสำหรับ __init __ (self) ตามค่าเริ่มต้น ฉันได้ลองทำสิ่งต่อไปนี้แล้ว:

.. automodule:: mymodule
    :members:

และ

..autoclass:: MyClass
    :members:

ใน conf.py การตั้งค่าต่อไปนี้จะต่อท้ายเฉพาะ __init __ (self) docstring เข้ากับ class docstring ( เอกสาร Autodoc ของ Sphinxดูเหมือนจะยอมรับว่านี่เป็นพฤติกรรมที่คาดหวัง แต่ไม่ได้ระบุอะไรเกี่ยวกับปัญหาที่ฉันกำลังพยายามแก้ไข):

autoclass_content = 'both'

ไม่นั่นไม่ใช่สิ่งที่เอกสารเขียน ณ วันนี้อย่างน้อยที่สุด: "both" Both the class’ and the __init__ method’s docstring are concatenated and inserted.-> ดังนั้นจึงไม่ควรเป็นเพียง__init__(self)docstring ของคลาสเท่านั้นหากคุณมี คุณสามารถจัดหากรณีทดสอบได้หรือไม่เพราะถ้าเป็นเช่นนั้นจะรู้สึกเหมือนมีข้อบกพร่องใช่ไหม?
lpapp

คำตอบ:


116

นี่คือสามทางเลือก:

  1. เพื่อให้แน่ใจว่า__init__()มีการบันทึกไว้เสมอคุณสามารถใช้autodoc-skip-memberใน conf.py แบบนี้:

    def skip(app, what, name, obj, would_skip, options):
        if name == "__init__":
            return False
        return would_skip
    
    def setup(app):
        app.connect("autodoc-skip-member", skip)
    

    สิ่งนี้กำหนดไว้อย่างชัดเจนว่า__init__จะไม่ข้าม (ซึ่งเป็นค่าเริ่มต้น) การกำหนดค่านี้ถูกระบุเพียงครั้งเดียวและไม่ต้องการมาร์กอัปเพิ่มเติมสำหรับทุกคลาสในซอร์ส. rst

  2. special-membersตัวเลือกที่ถูกเพิ่มเข้ามาในสฟิงซ์ 1.1 ทำให้สมาชิก "พิเศษ" (ที่มีชื่อเหมือน__special__) ได้รับการบันทึกโดย autodoc

    ตั้งแต่ Sphinx 1.2 ตัวเลือกนี้ใช้อาร์กิวเมนต์ซึ่งทำให้มีประโยชน์มากกว่าเดิม

  3. ใช้automethod:

    .. autoclass:: MyClass     
       :members: 
    
       .. automethod:: __init__
    

    สิ่งนี้จะต้องถูกเพิ่มสำหรับทุกชั้นเรียน (ไม่สามารถใช้กับautomoduleได้ตามที่ระบุไว้ในความคิดเห็นสำหรับการแก้ไขครั้งแรกของคำตอบนี้)


7
นั่นไม่ได้ช่วยเกี่ยวกับโมดูลอัตโนมัติเนื่องจากต้องเพิ่มในทุกคลาส
Roger Binns

3
ทางเลือกแรกใช้ได้ผล ในกรณีของฉันมันดีกว่าทางเลือกที่สองและสามเนื่องจากไม่จำเป็นต้องแก้ไขไฟล์. rst
jcarballo

9
ใน Sphinx 1.2.1 special-membersทำงานได้ดีโดยใช้automodule. ใช้เอกสารเท่านั้น:special-members: __init__ __init__
Florian Brucker

68

คุณอยู่ใกล้ คุณสามารถใช้autoclass_contentตัวเลือกในconf.pyไฟล์ของคุณ:

autoclass_content = 'both'

1
@MichaelMrozek: ฉันก็สงสัยเหมือนกัน ... คุณเข้าใจอัตราการโหวตสูงของคำตอบนี้หรือไม่? ตอนแรกดูเหมือนคำตอบว่าควรถูกกวาดล้าง
lpapp

1
ฉันลองตั้งค่าautoclass_content = 'both'ตัวเลือกซึ่งทำเอกสารเกี่ยวกับวิธีการเริ่มต้น แต่ทำให้ข้อมูลสรุปอัตโนมัติปรากฏขึ้นสองครั้ง
ยืด

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ ง่ายกว่าและอ้างอิงถึงเอกสารของสฟิงซ์อย่างเป็นทางการ
BerriJ

6

ในช่วงหลายปีที่ผ่านมาผมเคยเขียนหลายสายพันธุ์ของautodoc-skip-memberการเรียกกลับสำหรับโครงการหลามต่าง ๆ ที่ไม่เกี่ยวข้องกันเพราะผมอยากวิธีการเช่น__init__(), __enter__()และ__exit__()จะแสดงในเอกสาร API ของฉัน (หลังจากทั้งหมดเหล่านี้ "วิธีพิเศษ" เป็นส่วนหนึ่งของ API และสิ่งที่ดีในการ จัดทำเอกสารไว้ใน docstring ของวิธีการพิเศษ)

เมื่อเร็ว ๆ นี้ฉันได้ใช้งานที่ดีที่สุดและทำให้เป็นส่วนหนึ่งของโครงการ Python ของฉัน ( นี่คือเอกสารประกอบ ) การใช้งานโดยทั่วไปจะลงมาดังนี้:

import types

def setup(app):
    """Enable Sphinx customizations."""
    enable_special_methods(app)


def enable_special_methods(app):
    """
    Enable documenting "special methods" using the autodoc_ extension.

    :param app: The Sphinx application object.

    This function connects the :func:`special_methods_callback()` function to
    ``autodoc-skip-member`` events.

    .. _autodoc: http://www.sphinx-doc.org/en/stable/ext/autodoc.html
    """
    app.connect('autodoc-skip-member', special_methods_callback)


def special_methods_callback(app, what, name, obj, skip, options):
    """
    Enable documenting "special methods" using the autodoc_ extension.

    Refer to :func:`enable_special_methods()` to enable the use of this
    function (you probably don't want to call
    :func:`special_methods_callback()` directly).

    This function implements a callback for ``autodoc-skip-member`` events to
    include documented "special methods" (method names with two leading and two
    trailing underscores) in your documentation. The result is similar to the
    use of the ``special-members`` flag with one big difference: Special
    methods are included but other types of members are ignored. This means
    that attributes like ``__weakref__`` will always be ignored (this was my
    main annoyance with the ``special-members`` flag).

    The parameters expected by this function are those defined for Sphinx event
    callback functions (i.e. I'm not going to document them here :-).
    """
    if getattr(obj, '__doc__', None) and isinstance(obj, (types.FunctionType, types.MethodType)):
        return False
    else:
        return skip

ใช่มีเอกสารประกอบมากกว่าตรรกะ :-) ข้อดีของการกำหนดการautodoc-skip-memberเรียกกลับเช่นนี้ในการใช้special-membersตัวเลือก (สำหรับฉัน) คือspecial-membersตัวเลือกนี้ยังเปิดใช้งานเอกสารคุณสมบัติเช่น__weakref__(มีอยู่ในคลาสสไตล์ใหม่ทั้งหมด AFAIK) ซึ่งฉันคิดว่าเสียงรบกวนและไม่มีประโยชน์เลย วิธีการเรียกกลับจะหลีกเลี่ยงสิ่งนี้ (เนื่องจากใช้ได้เฉพาะกับฟังก์ชัน / วิธีการและละเว้นแอตทริบิวต์อื่น ๆ )


ฉันจะใช้สิ่งนี้ได้อย่างไร? ดูเหมือนว่าต้องตั้งชื่อวิธีการsetup(app)เพื่อให้ Sphinx ดำเนินการได้
oarfish

ฉันไม่เข้าใจทั้งหมด แต่ดูการใช้งานของ xolox หากคุณต้องการผ่าตัวเอง ฉันเชื่อว่าเขาสร้างส่วนขยายสฟิงซ์ที่เชื่อมต่อการโทรกลับไปยังเหตุการณ์ autodoc-skip-member เมื่อสฟิงซ์พยายามคิดว่าควรจะรวม / ข้ามเหตุการณ์นั้นหรือไม่และโค้ดของเขาจะทำงาน หากรหัสของเขาตรวจพบสมาชิกพิเศษที่ผู้ใช้กำหนดไว้อย่างชัดเจน (ที่สืบทอดมามักจะเกิดขึ้น) ระบบจะบอกให้สฟิงซ์รวมไว้ด้วย ด้วยวิธีนี้คุณสามารถหาสมาชิกพิเศษที่คุณเขียนด้วยตัวเอง
Andrew

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

@ JoelB: โค้ดตัวอย่างในโพสต์ของฉันเขียนขึ้นเพื่อสมมติว่า__init__เมธอดของคุณมี docstring ที่ไม่ว่างเปล่า ทำมัน?
xolox

2

แม้ว่านี่จะเป็นโพสต์ที่เก่ากว่า แต่สำหรับผู้ที่กำลังมองหาในตอนนี้ยังมีโซลูชันอื่นที่แนะนำในเวอร์ชัน 1.8 ตามเอกสารประกอบคุณสามารถเพิ่ม special-memberคีย์ใน autodoc_default_options ลงในไฟล์conf.py.

ตัวอย่าง:

autodoc_default_options = {
    'members': True,
    'member-order': 'bysource',
    'special-members': '__init__',
    'undoc-members': True,
    'exclude-members': '__weakref__'
}

0

นี่เป็นตัวแปรที่รวมเฉพาะใน__init__กรณีที่มีข้อโต้แย้ง:

import inspect

def skip_init_without_args(app, what, name, obj, would_skip, options):
    if name == '__init__':
        func = getattr(obj, '__init__')
        spec = inspect.getfullargspec(func)
        return not spec.args and not spec.varargs and not spec.varkw and not spec.kwonlyargs
    return would_skip

def setup(app):
    app.connect("autodoc-skip-member", skip_init_without_args)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.