पीईपी 257 रूसी में। (डॉकस्ट्रिंग्स समझौता)

हेलो, हैबर। ऐसे समय होते हैं जब आप अपने आप को भाषा में यथासंभव विसर्जित करना चाहते हैं और इसकी सभी बारीकियों को समझते हैं। पायथन के मामले में, ऐसा करने का सबसे अच्छा तरीका आधिकारिक वेबसाइट पर प्रलेखन और पीईपी पढ़ना है। मैंने उस समय ऐसा नहीं किया था, क्योंकि मैं "तकनीकी" पहलुओं में से कई को नहीं समझ सकता था, और रूसी अनुवाद के कोई भी संस्करण नहीं थे। अब मैंने खुद PEP-257 का अनुवाद करने का फैसला किया, जो कोड के सही प्रलेखन के बारे में बताता है, क्योंकि यकीन है कि इससे शुरुआती लोगों को कोड लिखने के लिए सही "पायथन" दृष्टिकोण को बेहतर ढंग से समझने में मदद मिलेगी। मैंने रूसी में कोड उदाहरणों का अनुवाद किया, लेकिन केवल बेहतर अर्थ बताने के लिए। वास्तविक प्रोग्रामिंग में, अंग्रेजी में प्रलेखन लाइनें लिखने का प्रयास करें। मैं तुरंत यह भी कहता हूं कि "डॉकस्ट्रिंग" शब्द के पर्याय के रूप में मैंने शब्दों का उपयोग किया: "प्रलेखन" और "दस्तावेज़ीकरण लाइनें"। ठीक है, चलो अनुवाद पर ही चलते हैं।

जोश257
शीर्षक:Docstrings समझौता
लेखक:डेविड गुडगर <python.org पर अच्छा>>, गुइडो वैन रोसुम <python.org> पर
चर्चा:dy-sig python.org पर
स्थिति:सक्रिय
एक प्रकार:सूचना
बनाया था:29 मई, 2001
प्रकाशन:13-जून -2001

टिप्पणी


यह PEP पाइथन डॉकस्ट्रिंग्स के उपयोग से जुड़े शब्दार्थ और सम्मेलनों का दस्तावेजीकरण करता है।

औचित्य


इस PEP का उद्देश्य दस्तावेज़ स्ट्रिंग्स की उच्च-स्तरीय संरचना को मानकीकृत करना है: यह वर्णन करने के लिए कि वास्तव में उन्हें क्या होना चाहिए और व्याख्या करना चाहिए (हम वास्तविक मार्कअप सिंटैक्स पर चर्चा नहीं करेंगे)। पीईपी में सख्त दिशानिर्देश नहीं हैं, लेकिन सिफारिशें:
“पारंपरिक परंपराएँ स्पष्टता, स्थिरता, रखरखाव में आसानी और अच्छी प्रोग्रामिंग आदतों को बढ़ावा देती हैं। लेकिन वे आपको अपनी इच्छा के विरुद्ध कार्य करने के लिए मजबूर नहीं करते हैं। यह पायथन है! ”

टिम पीटर्स ऑन comp.lang.python, 2001-06-16

यदि आप आम तौर पर स्वीकृत समझौतों से बचते हैं, तो आप सबसे खराब स्थिति में होंगे। लेकिन कुछ एप्लिकेशन हैं (उदाहरण के लिए, डॉक्यूटिल्स जैसी प्रलेखन प्रणाली) जो आपको समझौतों के बारे में जानने और उनका पालन करने पर बेहतर परिणाम प्राप्त करने की अनुमति देगा।

विशिष्टता


एक डॉकस्ट्रिंग क्या है?


एक प्रलेखन स्ट्रिंग एक स्ट्रिंग शाब्दिक है जो एक मॉड्यूल, फ़ंक्शन, क्लास या विधि परिभाषा में पहला कथन है। इस वस्तु के विशेष __doc__ विशेषता को संभालते समय ऐसी स्ट्रिंग उपलब्ध हो जाती है।

सभी पुस्तकालयों, साथ ही उनके द्वारा निर्यात किए गए फ़ंक्शंस और कक्षाएं, डॉकस्ट्रिंग होनी चाहिए। सार्वजनिक विधियों (__ init__ कंस्ट्रक्टर सहित) के पास भी दस्तावेज होना चाहिए। पैकेज को अपने संबंधित निर्देशिका में __init__.py फ़ाइल के अंदर प्रलेखित किया जा सकता है।

कोड में कहीं और पाए गए स्ट्रिंग शाब्दिक भी प्रलेखन की भूमिका निभा सकते हैं। वे पायथन बाइटकोड कंपाइलर द्वारा मान्यता प्राप्त नहीं हैं और रन टाइम पर ऑब्जेक्ट विशेषताओं के रूप में उपलब्ध नहीं हैं (यानी उन्हें __ doc__ में जानकारी का अभाव है)। लेकिन दो अतिरिक्त प्रकार की प्रलेखन लाइनें हैं जो अन्य सॉफ़्टवेयर टूल का उपयोग करके पुनर्प्राप्त की जाती हैं:

  1. मॉड्यूल, वर्ग या __in__ स्तर पर एक साधारण असाइनमेंट के तुरंत बाद होने वाले स्ट्रिंग शाब्दिक "विशेषता प्रलेखन स्ट्रिंग्स" कहलाते हैं। (विशेषता docstrings)
  2. स्ट्रिंग शाब्दिक जो दस्तावेज़ की एक और पंक्ति के तुरंत बाद होती हैं, उन्हें "अतिरिक्त प्रलेखन लाइनें" कहा जाता है। (अतिरिक्त खुराक)

कृपया PEP 258 को देखें, "डॉकुटिल्स प्रोजेक्ट स्पेसिफिकेशन," विशेषता और अतिरिक्त डोकस्ट्रिंग्स के बारे में अधिक जानकारी के लिए।

[लगभग। ईडी। पीईपी 258 की व्याख्या]
def f(x):
    """  docstring   __doc__ ."""
    """
     "additional docstrings",   , 
        Docutils.
    """
    return x**2

f.a = 1
""" "attribute docstrings"   : f.a"""

सुसंगतता के लिए, हमेशा दस्तावेज़ीकरण लाइन के आसपास "" ट्रिपल ट्रिपल कोट्स "" का उपयोग करें। यदि आप बैकस्लैश वर्णों ("\") का उपयोग करते हैं, तो अपने प्रलेखन में r "" "कच्ची डबल-उद्धृत स्ट्रिंग" "" का उपयोग करें। यूनिकोड अक्षरों वाले डॉकस्ट्रिंग के लिए, "" यूनिकोड स्ट्रिंग को ट्रिपल डबल कोट्स "" में प्रयोग करें। [लगभग। यूनिकोड के तारों ने अजगर 3.x में अपना अर्थ खो दिया है]

डॉकस्ट्रिंग के दो रूप हैं: सिंगल-लाइन और मल्टी-लाइन।

एकल पंक्ति प्रलेखन लाइनें


सिंगल-लाइन स्ट्रिंग्स का उपयोग स्पष्ट मामलों के लिए किया जाता है और उन्हें वास्तव में एक ही लाइन पर होना चाहिए। उदाहरण के लिए:

def kos_root():
    """    root KOS"""
    global _kos_root
    if _kos_root: return _kos_root
    ...

टिप्पणियों:

  • . .
  • , . docstring .
  • , .
  • — «», . (« », « »), . , : « ...».

    « » «Return pathname» «Returns pathname». PEP-257 , .
  • «», / ( ). :

    def function(a, b):
        """function(a, b) -> list"""
    

    , C ( ), . . - :

    def function(a, b):
        def function(a, b):
        """ X   ."""
    

    ( -, « X» !)

    , : « », «description» . , , .



मल्टी-लाइन प्रलेखन में एक सारांश रेखा होती है जिसमें एकल-रेखा डॉकस्ट्रिंग के समान संरचना होती है, जिसके बाद एक खाली रेखा और फिर एक अधिक जटिल विवरण होता है। "सारांश रेखा" का उपयोग स्वचालित प्रलेखन के माध्यम से किया जा सकता है; इसलिए, इसे एक पंक्ति में रखना और फिर एक पंक्ति में एक पास बनाना इतना महत्वपूर्ण है। सारांश रेखा प्रारंभिक उद्धरण चिह्नों के तुरंत बाद लिखी जाती है, लेकिन इसे एक हाइफ़नेशन करने और अगली पंक्ति से शुरू करने की अनुमति है। [लगभग। इस वाक्य के बाद, मैं खुश था, क्योंकि ऐसे लोग थे जिन्होंने मुझे लगातार यह साबित करने की कोशिश की थी कि किसी भी मामले में स्थानांतरण को अंजाम देना असंभव है :-)] एक ही समय में, पूरे डॉकस्ट्रिंग में एक ही इंडेंटेशन होना चाहिए क्योंकि पहली पंक्ति के उद्घाटन अंकन (उदाहरण देखें) नीचे)।

क्लास में उपयोग किए जाने वाले सभी दस्तावेज़ीकरण (सिंगल-लाइन या मल्टी-लाइन) के बाद एक खाली लाइन छोड़ दें; आम तौर पर, क्लास के तरीकों को एक दूसरे से एक खाली लाइन से अलग किया जाना चाहिए, इसलिए क्लास डॉक्यूमेंटेशन लाइन को भी पहले तरीके से अलग किया जाना चाहिए।

स्क्रिप्ट का दस्तावेज़ीकरण (स्टैंड-अलोन प्रोग्राम) एक संदेश है "उचित उपयोग के बारे में" और संभवत: तब प्रिंट किया जाएगा जब स्क्रिप्ट को अमान्य या लापता तर्क (या "-एच" विकल्प के साथ "सहायता" प्राप्त करने के लिए कहा जाता है)। इस तरह की डॉक्यूमेंटेशन लाइन में स्क्रिप्ट पैरामीटर्स की कार्यक्षमता और सिंटैक्स के साथ-साथ पर्यावरण चर और फाइलों का उपयोग किया जाना चाहिए। यह संदेश बल्कि जटिल हो सकता है (मैनुअल कई पूर्ण स्क्रीन लंबा है), लेकिन साथ ही यह नए उपयोगकर्ताओं के लिए सुविधाजनक होना चाहिए ताकि वे कमांड का सही उपयोग कर सकें। इसके अलावा, मैनुअल को अधिक अनुभवी उपयोगकर्ताओं के लिए सभी मापदंडों और तर्कों का स्पष्ट विवरण देना चाहिए।

मॉड्यूल प्रलेखन में आमतौर पर कक्षाओं, अपवादों और कार्यों (और किसी भी अन्य महत्वपूर्ण वस्तुओं) की एक सूची शामिल होनी चाहिए जो पुस्तकालय का उपयोग करके निर्यात की जाती है, साथ ही उनमें से प्रत्येक के लिए एक-पंक्ति स्पष्टीकरण भी है। (यह सारांश, एक नियम के रूप में, वस्तु के डॉकस्ट्रिंग में सारांश रेखा से कम विवरण देता है)। पैकेज डॉक्यूमेंटेशन (यानी, __init__.py में मॉड्यूल डॉकस्ट्रिंग) को मुख्य एक द्वारा निर्यात किए गए मॉड्यूल और सबपैकेज का वर्णन और सूची बनाना चाहिए।

किसी फ़ंक्शन या विधि के दस्तावेज़ीकरण में उनके व्यवहार, तर्क, रिटर्न मान, साइड इफेक्ट, अपवाद, और प्रतिबंधों का वर्णन किया जाना चाहिए जब उन्हें (यदि कोई हो) कहा जा सकता है। आपको वैकल्पिक तर्क भी निर्दिष्ट करने होंगे। यह स्पष्ट किया जाना चाहिए कि क्या मुख्य तर्क इंटरफ़ेस का हिस्सा हैं या नहीं।

कक्षा प्रलेखन को अपने व्यवहार को संक्षेप में प्रस्तुत करना चाहिए और सार्वजनिक विधियों के साथ-साथ उदाहरण चर भी सूचीबद्ध करना चाहिए। यदि कक्षा में एक अतिरिक्त इंटरफ़ेस के साथ उपवर्ग होंगे, तो इस इंटरफ़ेस को अलग से निर्दिष्ट किया जाना चाहिए (लेकिन सब कुछ इस दस्तावेज़ में भी है)। वर्ग निर्माणकर्ता के पास __init__ विधि के लिए अपनी अलग प्रलेखन लाइन होनी चाहिए। स्वतंत्र (व्यक्तिगत) तरीकों का अपना प्रलेखन होना चाहिए।

यदि एक वर्ग एक वंशज है और इसका व्यवहार मुख्य रूप से मुख्य वर्ग से विरासत में मिला है, तो इसके प्रलेखन में इसका उल्लेख करना और संभावित अंतर का वर्णन करना आवश्यक है। यह इंगित करने के लिए क्रिया "ओवरराइड" का उपयोग करें कि एक विधि को बदल दिया गया है और इसके परिणामस्वरूप, सुपरक्लास विधि को नहीं बुलाया जाएगा। यदि उपवर्ग विधि सुपरक्लास विधि (अपने स्वयं के व्यवहार के अलावा) को बुलाती है, तो "विस्तार" का उपयोग करें। अपरकेस में फ़ंक्शन तर्क या विधियों का उल्लेख करने के लिए Emacs सम्मेलन का उपयोग

करें। पायथन केस-संवेदी है, और तर्क नामों को कभी-कभी कुंजी द्वारा पास करते समय उपयोग किया जा सकता है, इसलिए प्रलेखन में वास्तविक चर नाम होने चाहिए। प्रत्येक तर्क को एक अलग लाइन पर सूचीबद्ध करना सबसे अच्छा है। उदाहरण के लिए:

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

     :
    real --   (  0.0)
    imag --   (  0.0)
    """
    if imag == 0.0 and real == 0.0:
        return complex_zero
    ...


यदि पूरा डॉकस्ट्रिंग लाइन पर फिट नहीं होता है, तो आप समापन उद्धरण चिह्नों को एक अलग लाइन पर रख सकते हैं। इस प्रकार, Emacs कमांड का उपयोग करना संभव होगा: भरण-पैरा

Docstring प्रसंस्करण


दस्तावेज़ीकरण लाइन प्रोसेसिंग टूल को दूसरी से शुरू होने वाली सभी गैर-खाली लाइनों के न्यूनतम इंडेंटेशन के बराबर इंडेंटेशन को हटा देना चाहिए। दस्तावेज़ीकरण की पहली पंक्ति में कोई भी इंडेंटेशन महत्वपूर्ण नहीं है और इसे हटा दिया जाएगा। दस्तावेज़ लाइन में बाद की लाइनों के सापेक्ष इंडेंटेशन को बरकरार रखा गया है। खाली लाइनों को दस्तावेज़ की लाइन की शुरुआत और अंत से हटा दिया जाना चाहिए।

चूंकि कोड शब्दों की तुलना में बहुत अधिक सटीक है, यहां एल्गोरिदम का कार्यान्वयन है:

def trim(docstring):
    if not docstring:
        return ''
    #     (  Python)
    #      :
    lines = docstring.expandtabs().splitlines()
    #    (   ):
    indent = sys.maxsize
    for line in lines[1:]:
        stripped = line.lstrip()
        if stripped:
            indent = min(indent, len(line) - len(stripped))
    #   (   ):
    trimmed = [lines[0].strip()]
    if indent < sys.maxsize:
        for line in lines[1:]:
            trimmed.append(line[indent:].rstrip())
    #       :
    while trimmed and not trimmed[-1]:
        trimmed.pop()
    while trimmed and not trimmed[0]:
        trimmed.pop(0)
    #    :
    return '\n'.join(trimmed)

अनुवादक का नोट
, python3 sys.maxint sys.maxsize, .


निम्नलिखित उदाहरण में प्रलेखन में दो नए अंक हैं और इसलिए तीन की लंबाई है। पहली और आखिरी लाइनें खाली हैं:

def foo ():
    """
       .
    """

हम स्पष्ट करते हैं:

>>> print repr(foo.__doc__)
'\n        .\n    '
>>> foo.__doc__.splitlines()
['', '        .', '    ']
>>> trim(foo.__doc__)
'    .'

इस प्रकार, प्रसंस्करण के बाद, निम्नलिखित प्रलेखन लाइनें समतुल्य होंगी:

def foo():
    """ 
     .
    """

def bar():
    """
     
     .
    """

अनुवादक का नोट
inspect, , : inspect.cleandoc(function.__doc__)


All Articles