PEP 257 باللغة الروسية. (اتفاقية الوثائق)

مرحبا يا هابر. هناك أوقات تريد فيها الانغماس في اللغة قدر المستطاع وفهم كل تفاصيلها الدقيقة. في حالة Python ، واحدة من أفضل الطرق للقيام بذلك هي قراءة الوثائق و PEPs على الموقع الرسمي. لم أفعل ذلك في ذلك الوقت ، لأنني لم أتمكن من فهم العديد من الجوانب "الفنية" ، ولم تكن هناك أشكال مختلفة من الترجمة الروسية. قررت الآن ترجمة PEP-257 بنفسي ، والذي يحكي عن التوثيق الصحيح للرمز ، لأنه بالتأكيد سيساعد المبتدئين على فهم نهج "Python" الحقيقي لكتابة الشفرة بشكل أفضل. لقد ترجمت أمثلة التعليمات البرمجية إلى اللغة الروسية ، ولكن فقط من أجل إيصال المعنى بشكل أفضل. في البرمجة الحقيقية ، حاول كتابة سطور التوثيق باللغة الإنجليزية. أقول أيضًا على الفور أنه كمرادف لمصطلح "docstring" استخدمت الكلمات: "التوثيق" و "سطور التوثيق". حسنًا ، دعنا ننتقل إلى الترجمة نفسها.

بيب257
عنوان:اتفاقية الوثائق
المؤلفون:David Goodger <goodger at python.org>، Guido van Rossum <guido at python.org>
نقاش:doc-sig في python.org
الحالة:نشيط
نوع:معلوماتية
خلقت:29 مايو 2001
المنشور:13-يونيو 2001

حاشية. ملاحظة


يوثق هذا PEP الدلالات والاتفاقيات المرتبطة باستخدام docstrings Python.

التبرير


الغرض من هذا PEP هو توحيد البنية عالية المستوى لسلاسل المستندات: لوصف ما يجب أن تحتوي عليه بالضبط وشرحه (لن نناقش الصيغة الفعلية للترميز). لا يحتوي PEP على إرشادات صارمة ، ولكن التوصيات:
"توفر الاتفاقيات التقليدية الوضوح والاتساق وسهولة الصيانة وتعزز عادات البرمجة الجيدة. لكنهم لا يجبرونك على التصرف ضد إرادتك. هذه بيثون! "

تيم بيترز على comp.lang.python ، 2001-06-16

إذا كنت تتجنب الاتفاقيات المقبولة بشكل عام ، فستكون محبطًا في أسوأ الأحوال. ولكن هناك بعض التطبيقات (على سبيل المثال ، أنظمة التوثيق مثل Docutils) التي ستسمح لك بتحقيق نتيجة أفضل إذا كنت تعرف الاتفاقيات واتبعها.

تخصيص


ما هو Docstring؟


سلسلة التوثيق هي سلسلة حرفية هي العبارة الأولى في تعريف الوحدة أو الوظيفة أو الفئة أو الطريقة. تصبح هذه السلسلة متاحة عند التعامل مع سمة __doc__ الخاصة لهذا الكائن.

يجب أن تحتوي جميع المكتبات ، بالإضافة إلى الوظائف والفئات التي تم تصديرها ، على مستندات. يجب أن تحتوي الطرق العامة (بما في ذلك مُنشئ __ init__) أيضًا على وثائق. يمكن توثيق الحزمة نفسها داخل ملف __init__.py الموجود في الدليل المقابل لها.

يمكن أن تلعب حرفية السلسلة الموجودة في مكان آخر في التعليمات البرمجية أيضًا دور التوثيق. لم يتم التعرف عليها من قبل Python bytecode compiler ولا تتوفر كسمات كائن في وقت التشغيل (أي أنها تفتقر إلى المعلومات في __ doc__). ولكن هناك نوعان إضافيان من خطوط التوثيق التي يتم استرجاعها باستخدام أدوات برمجية أخرى:

  1. تسمى حرفية السلسلة التي تحدث مباشرة بعد مهمة بسيطة على الوحدة أو الفئة أو __init__ "سلاسل توثيق السمة". (مستندات السمة)
  2. يُطلق على حرفية السلسلة التي تحدث مباشرة بعد سطر آخر من التوثيق "سطور توثيق إضافية". (مستندات إضافية)

يرجى الاطلاع على PEP 258 ، "مواصفات مشروع Docutils" ، لمزيد من التفاصيل حول السمة ووثائق إضافية.

[تقريبا. إد. شرح PEP 258]
def f(x):
    """  docstring   __doc__ ."""
    """
     "additional docstrings",   , 
        Docutils.
    """
    return x**2

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

لتحقيق التناسق ، استخدم دائمًا "" "علامات الاقتباس المزدوجة الثلاثية" "حول سطر التوثيق. إذا كنت تستخدم أحرف الخط المائل العكسي ("\") ، فاستخدم السلسلة الأولية المزدوجة "" "في وثائقك. بالنسبة إلى docstring الذي يحتوي على أحرف Unicode ، استخدم سلسلة "" Unicode في علامات الاقتباس المزدوجة الثلاثية "" ". [تقريبا. سلاسل unicode فقدت معناها في الثعبان 3.x]

هناك شكلين من docstring: سطر واحد ومتعدد الخطوط.

خطوط توثيق سطر واحد


تُستخدم السلاسل أحادية السطر للحالات الواضحة ويجب أن تكون بالفعل على نفس السطر. على سبيل المثال:

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» . , , .



تتكون الوثائق متعددة الأسطر من سطر ملخص له نفس بنية مستند مفرد من سطر واحد ، يليه سطر فارغ ، ثم وصف أكثر تعقيدًا. يمكن استخدام "سطر الملخص" عن طريق التوثيق التلقائي ؛ لذلك ، من المهم وضعه على سطر واحد ثم تمريره في سطر واحد. تتم كتابة سطر الملخص مباشرة بعد علامات الاقتباس الافتتاحية ، ولكن يُسمح بعمل الواصلة والبدء من السطر التالي. [تقريبا. بعد هذه الجملة ، كنت سعيدًا ، لأنه كان هناك أشخاص حاولوا باستمرار أن يثبتوا لي أنه من المستحيل إجراء النقل في أي حال :-)] في نفس الوقت ، يجب أن يكون للمستند بأكمله نفس المسافة البادئة مثل علامات الاقتباس الافتتاحية للسطر الأول (انظر المثال أدناه).

اترك سطرًا فارغًا بعد جميع الوثائق (سطر واحد أو متعدد الأسطر) المستخدمة في الفصل ؛ بشكل عام ، يجب فصل طرق الفصل عن بعضها البعض بسطر فارغ واحد ، وبالتالي يجب أيضًا فصل سطر وثائق الفصل بهذه الطريقة عن الطريقة الأولى.

توثيق البرنامج النصي (برنامج قائم بذاته) هو رسالة "حول الاستخدام الصحيح" ومن المحتمل أن تتم طباعته عندما يتم استدعاء البرنامج النصي بحجج غير صالحة أو مفقودة (أو مع خيار "-h" للحصول على "مساعدة"). يجب أن يصف سطر التوثيق هذا وظيفية وبنية معلمات البرنامج النصي ، بالإضافة إلى متغيرات البيئة والملفات المستخدمة. قد تكون هذه الرسالة معقدة إلى حد ما (يتألف الدليل من عدة شاشات كاملة) ، ولكن في نفس الوقت يجب أن تكون مناسبة للمستخدمين الجدد حتى يتمكنوا من استخدام الأمر بشكل صحيح. أيضًا ، يجب أن يقدم الدليل وصفًا واضحًا لجميع المعلمات والحجج للمستخدمين الأكثر خبرة.

يجب أن تحتوي وثائق الوحدة عادةً على قائمة بالفئات والاستثناءات والوظائف (وأي كائنات أخرى مهمة) يتم تصديرها باستخدام المكتبة ، بالإضافة إلى شرح من سطر واحد لكل منها. (يعطي هذا الملخص ، كقاعدة ، تفاصيل أقل من سطر الملخص في docstring للكائن نفسه). يجب أيضًا أن تصف وثائق الحزمة (أي ، وحدة docstring في __init__.py) وتسرد الوحدات والحزم الفرعية التي تم تصديرها بواسطة الوحدة الرئيسية.

يجب أن يصف توثيق دالة أو طريقة سلوكهم ، وسيطاتهم ، وقيم الإرجاع ، والآثار الجانبية ، والاستثناءات ، والقيود المفروضة على متى يمكن استدعاؤهم (إن وجد). يجب عليك أيضًا تحديد وسيطات اختيارية. يجب توضيح ما إذا كانت الوسيطات الرئيسية جزءًا من الواجهة.

يجب أن يلخص توثيق الصف سلوكه ويسرد الطرق العامة بالإضافة إلى متغيرات الحالة. إذا كان للفئة فئات فرعية بواجهة إضافية ، فيجب تحديد هذه الواجهة بشكل منفصل (ولكن كل شيء موجود أيضًا في هذه الوثائق). يجب أن يكون لمنشئ الفئة سطر وثائق منفصل خاص به لطريقة __init__. يجب أن يكون للطرق المستقلة (الفردية) وثائق خاصة بها.

إذا كان الفصل سليلًا وكان سلوكه موروثًا بشكل أساسي من الفصل الرئيسي ، فمن الضروري ذكر ذلك في توثيقه ووصف الاختلافات المحتملة. استخدم الفعل "تجاوز" للإشارة إلى أنه تم تغيير طريقة ما ، ونتيجة لذلك ، لن يتم استدعاء طريقة الطبقة الفائقة. استخدم الفعل "يمتد" إذا كانت طريقة الفئة الفرعية تستدعي طريقة الفئة الفائقة (بالإضافة إلى سلوكها الخاص).

لا تستخدم اصطلاح Emacs لذكر الحجج أو الأساليب الدالة في الأحرف الكبيرة. Python حساس لحالة الأحرف ، ويمكن استخدام أسماء الوسيطات أحيانًا عند تمريرها بالمفاتيح ، لذلك يجب أن تحتوي الوثائق على أسماء متغيرات حقيقية. من الأفضل إدراج كل وسيطة في سطر منفصل. على سبيل المثال:

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: ملء الفقرة

معالجة التوثيق


يجب أن تزيل أدوات معالجة خط التوثيق نفس عدد المسافة البادئة مساوية للحد الأدنى للمسافة البادئة لجميع الأسطر غير الفارغة ، بدءًا من الثانية. أي مسافة بادئة في السطر الأول من الوثائق ليست مهمة وسيتم حذفها. يتم الاحتفاظ بالمسافة البادئة النسبية للأسطر اللاحقة في سطر المستند. يجب إزالة الأسطر الفارغة من بداية ونهاية سطر المستند.

نظرًا لأن الشفرة أكثر دقة من الكلمات ، فإليك تنفيذ الخوارزمية:

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