কোনও শ্রেণীর __init __ (স্ব) পদ্ধতি নথির জন্য কীভাবে স্পিনাক্সের অটোডোক ব্যবহার করবেন?


107

স্পিনিক্স ডিফল্টরূপে __init __ (স্ব) এর জন্য ডক্স তৈরি করে না। আমি নিম্নলিখিত চেষ্টা করেছি:

.. automodule:: mymodule
    :members:

এবং

..autoclass:: MyClass
    :members:

কনফাই.পি-তে, নিম্নলিখিতগুলি সেট করা কেবলমাত্র ক্লাসের ডক্ট্রিং-এর সাথে __init __ (স্ব) ডাস্ট্রিং যুক্ত করে ( স্পিনিক্স অটোডোক ডকুমেন্টেশন সম্মত বলে মনে হয় যে এটি প্রত্যাশিত আচরণ, তবে আমি যে সমস্যাটি সমাধান করার চেষ্টা করছি সে সম্পর্কিত কিছুই উল্লেখ করা হয়নি):

autoclass_content = 'both'

না, ডকুমেন্টেশনটি আজকের মতো এটিই নয়, "both" Both the class’ and the __init__ method’s docstring are concatenated and inserted.- কমপক্ষে: -> অতএব, এটি __init__(self)যদি কেবল থাকে তবে ক্লাসের ডক্ট্রিং হওয়া উচিত নয় । আপনি কি কোনও পরীক্ষার কেস সরবরাহ করতে পারেন কারণ যদি এটি হয় তবে এটি বাগের মতো মনে হচ্ছে, তাই না?
lpapp

উত্তর:


116

এখানে তিনটি বিকল্প রয়েছে:

  1. __init__()সর্বদা নথিভুক্ত রয়েছে তা নিশ্চিত করতে, আপনি autodoc-skip-memberকনফাই.পি. এটার মত:

    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__বাদ দেওয়া হয়নি (যা এটি ডিফল্টরূপে নয়) সংজ্ঞায়িত করে । এই কনফিগারেশনটি একবারে নির্দিষ্ট করা হয় এবং এটি প্রথম উত্সের প্রতিটি শ্রেণীর জন্য কোনও অতিরিক্ত মার্কআপের প্রয়োজন হয় না।

  2. special-membersবিকল্প ছিল স্পিংক্স 1.1 যোগ । এটি "বিশেষ" সদস্যদের (যাদের নাম রয়েছে তাদের __special__) অটোডোক দ্বারা নথিভুক্ত করা হয়।

    স্পিঙ্কস ১.২ থেকে, এই বিকল্পটি যুক্তিগুলি গ্রহণ করে যা এটি আগের চেয়ে বেশি কার্যকর করে তোলে।

  3. ব্যবহার automethod :

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

    এটি প্রতিটি শ্রেণীর জন্য যুক্ত করতে হবে ( automoduleএই উত্তরের প্রথম সংশোধনের মন্তব্যে উল্লেখ করা হিসাবে এটি ব্যবহার করা যাবে না )।


7
এটি অটোমোডুলে সহায়তা করে না কারণ এটি প্রতিটি ক্লাসে যুক্ত করতে হয়।
রজার বিনস

3
প্রথম বিকল্প কাজ। আমার ক্ষেত্রে এটি দ্বিতীয় এবং তৃতীয় বিকল্পের চেয়ে ভাল ছিল, কারণ এটি প্রথম ফাইলগুলি সম্পাদনা করার প্রয়োজন হয় না।
jcarballo

9
স্পিঙ্কস ১.২.১ এ, special-membersব্যবহার করে সূক্ষ্মভাবে কাজ করে automodule:special-members: __init__কেবলমাত্র নথিতে ব্যবহার করুন __init__
ফ্লোরিয়ান ব্রুকার 11

67

আপনি বন্ধ ছিল. আপনি autoclass_contentআপনার conf.pyফাইলটিতে বিকল্পটি ব্যবহার করতে পারেন :

autoclass_content = 'both'

1
@ মিশেলমরোজেক: আমিও সে সম্পর্কে অবাক হয়েছি ... আপনি কি এই উত্তরটির উচ্চতর হার বুঝতে পেরেছেন? প্রথমদিকে, এটি এমন একটি উত্তরের মতো দেখাচ্ছে যা শুদ্ধ করা উচিত।
lpapp

1
আমি সেটিং চেষ্টা autoclass_content = 'both'বিকল্প, যা দলিল করেনি Init পদ্ধতি, কিন্তু এটা autosummary দুইবার প্রতীয়মান করেছিলো।
প্রসারিত করুন

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি সহজ এবং এটি অফিশিয়াল স্পিংক্স ডকুমেন্টেশনকে বোঝায়।
বেরিজে

6

গত কয়েক বছর ধরে আমি বেশ কয়েক রূপগুলো লিখেছি autodoc-skip-memberবিভিন্ন সম্পর্কহীন পাইথন প্রকল্পগুলির জন্য callbacks কারণ আমি পদ্ধতি পছন্দ চাচ্ছিল __init__(), __enter__()এবং__exit__() (আমার এপিআই ডকুমেন্টেশন দেখা সব পরে, এই "বিশেষ পদ্ধতি" API- এর অংশ এবং কি ভাল জায়গা বিশেষ পদ্ধতির ডাস্ট্রিংয়ের চেয়ে এগুলি নথিভুক্ত করুন)।

সম্প্রতি আমি সেরা বাস্তবায়ন করেছি এবং এটিকে আমার পাইথন প্রকল্পগুলির একটিতে পরিণত করেছি ( এখানে ডকুমেন্টেশন রয়েছে )। বাস্তবায়নটি মূলত এতে নেমে আসে:

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__সমস্ত নতুন-স্টাইলের ক্লাসে পাওয়া যায়, এএএফআইকে) যেমন বৈশিষ্ট্যগুলির ডকুমেন্টেশন সক্ষম করে যা আমি গোলমাল বিবেচনা করি এবং মোটেই দরকারী না। কলব্যাক পদ্ধতির বিষয়টি এড়িয়ে চলে (কারণ এটি কেবল ফাংশন / পদ্ধতিতে কাজ করে এবং অন্যান্য বৈশিষ্ট্যগুলি উপেক্ষা করে)।


আমি এটি কীভাবে ব্যবহার করব? মনে হচ্ছে setup(app)স্পিনিক্স দ্বারা সম্পাদন করার জন্য পদ্ধতিটির নাম অবশ্যই রাখা উচিত ।
অ্যারফিশ

আমি এগুলি সবই বুঝতে পারি না, তবে আপনি যদি নিজেকে ছড়িয়ে দিতে চান তবে xolox এর বাস্তবায়ন দেখুন । আমি বিশ্বাস করি তিনি একটি স্পিনিক্স এক্সটেনশন তৈরি করেছিলেন যা অটোডোক-স্কিপ-সদস্য ইভেন্টের সাথে একটি কলব্যাককে সংযুক্ত করে। যখন স্ফিংকস কিছু অন্তর্ভুক্ত করা উচিত / সেই ইভেন্টে আগুন ছড়িয়ে পড়েছিল এবং তার কোডটি চালিত হয় কিনা তা বের করার চেষ্টা করে। যদি তার কোডটি কোনও বিশেষ সদস্যকে সনাক্ত করে যা ব্যবহারকারীর দ্বারা স্পষ্টভাবে সংজ্ঞায়িত করা হয়েছিল (উত্তরাধিকারসূত্রে প্রায়ই ঘটে যেমন ঘটে থাকে) তবে এটি স্পিনক্সকে এটি অন্তর্ভুক্ত করতে বলে। আপনি
অ্যান্ড্রু

অ্যান্ড্রু স্পষ্টকরণের জন্য ধন্যবাদ এবং হ্যাঁ আপনি সঠিক অর্ফিশ, একটি সেটআপ ফাংশন প্রয়োজন। আরও বিভ্রান্তি এড়াতে আমি এটি উদাহরণে যুক্ত করেছি।
xolox

@ জোয়েলবি: আমার পোস্টের উদাহরণ কোডটি ধরে নেওয়া হয়েছে যে আপনার __init__পদ্ধতিতে অসাধারণ একটি ডক্ট্রিং রয়েছে ume এটা কি পারে?
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.