PEP 3107 (التعليقات التوضيحية للميزات)

تحية للجميع. قررت أن أفهم بشكل كامل التعليقات التوضيحية لـ Python وفي نفس الوقت أترجم سلسلة من الأشخاص السياسيين المحتملين الذين يوثقون هذا الموضوع. سنبدأ بمعايير 3.X وننتهي مع الابتكارات في الثعبان 3.8. يجب أن أقول على الفور أن هذا PEP هو واحد من أبسطها وقراءتها مفيدة فقط للمبتدئين. حسنًا ، دعنا نذهب:


PEP 572 - التعليقات التوضيحية للميزات

بيب3107
عنوان:ميزة التعليقات التوضيحية
المؤلفون:كولين وينتر <collinwinter في google.com> ، توني لوندس <tony at lownds.com>
الحالة:نهائي
نوع:اساسي
خلقت:2 ديسمبر 2006
نسخة بايثون:3.0

شرح المعيار


يقدم هذا PEP بناء الجملة لإضافة التعليقات التوضيحية العشوائية (البيانات الوصفية) إلى الوظائف في Python.

التبرير


لم يكن للوظائف في Python 2.x طريقة مضمنة لإضافة تعليق توضيحي للمعلمات وإرجاع القيم. لمعالجة هذه الفجوة ، ظهرت العديد من الأدوات والمكتبات. يستخدم بعضهم الديكور الموصوف في PEP 318 ، بينما يحلل البعض الآخر وظائف docstring ويبحثون عن المعلومات هناك.

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

أساسيات التعليقات التوضيحية للميزات


قبل أن نبدأ في مناقشة التعليقات التوضيحية لميزات Python 3.0 ، دعنا نتحدث أولاً عن ميزاتها بعبارات عامة:

  1. التعليقات التوضيحية للمعلمات وقيم الإرجاع للوظائف اختيارية تمامًا.
  2. التعليقات التوضيحية ليست أكثر من طريقة لربط التعبيرات التعسفية بأجزاء مختلفة من دالة في وقت الترجمة.

    Python نفسها لا تولي أي اهتمام للتعليقات التوضيحية. الشيء الوحيد هو أنه يسمح لك بالوصول إليها ، وهو موضح في قسم "الوصول إلى التعليقات التوضيحية للميزات" أدناه.

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

    def compile(source: "something compilable",
                filename: "where the compilable thing comes from",
                mode: "is this a single statement or a suite?"):
        ...

    قد تستخدم مكتبة أخرى وظيفة Python والتعليقات التوضيحية للطريقة للتحقق من مطابقة النوع. يمكن لهذه المكتبة استخدام التعليقات التوضيحية لإظهار أنواع بيانات الإدخال التي تتوقعها ونوع البيانات التي ستعرضها. ربما سيكون شيء من هذا القبيل:

    def haul(item: Haulable, *vargs: PackAnimal) -> Distance:
        ...

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

بناء الجملة


المعلمات


التعليقات التوضيحية للمعلمات هي تعبيرات اختيارية تتبع اسم المعلمة نفسها:

def foo (a: , b:  = 5):
    ...

في البرمجة الكاذبة ، تبدو المعلمات الآن مثل: معلمة [: تعبير] [= تعبير] . أي أن التعليقات التوضيحية ، مثل القيم الافتراضية ، اختيارية وتسبقها دائمًا. تمامًا مثل استخدام علامة المساواة للإشارة إلى قيمة افتراضية ، يتم استخدام النقطتين للتعليقات التوضيحية. يتم تقييم جميع تعبيرات التعليقات التوضيحية ، مثل القيم الافتراضية ، عند تنفيذ تعريف دالة. الحصول على وسيطات "إضافية" (أي * args و ** kwargs) له نفس البنية:

def foo(*args: expression, **kwargs: expression):
    ...

دائمًا ما تتبع التعليقات التوضيحية للمعلمات المتداخلة اسم المعلمة ، وليس القوس الأخير. التعليق التوضيحي لكل "اسم" في المعلمة المتداخلة غير مطلوب:

def foo((x1, y1: expression),
        (x2: expression, y2: expression)=(None, None)):
    ...

قيم الإرجاع


حتى الآن ، لم نقدم مثالًا على كيفية إضافة تعليقات توضيحية إلى نوع الإرجاع في الوظائف. يتم ذلك على النحو التالي:

def sum() -> expression:
    ...

بمعنى أن الحرف -> ونوع من التعبير يمكن أن يتبع الآن قائمة المعلمات. مثل التعليقات التوضيحية للمعلمات ، سيتم تقييم هذا التعبير عند تنفيذ تعريف الوظيفة.

القواعد الكاملة لإعلانات الوظائف هي الآن كما يلي:

decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
decorators: decorator+
funcdef: [decorators] 'def' NAME parameters ['->' test] ':' suite
parameters: '(' [typedargslist] ')'
typedargslist: ((tfpdef ['=' test] ',')*
                ('*' [tname] (',' tname ['=' test])* [',' '**' tname]
                 | '**' tname)
                | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
tname: NAME [':' test]
tfpdef: tname | '(' tfplist ')'
tfplist: tfpdef (',' tfpdef)* [',']

لامداس


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

  1. قد ينتهك هذا التوافق مع الإصدارات السابقة.
  2. لامداس محايدة ومجهولة التعريف
  3. يمكن دائمًا إعادة كتابة Lambdas كوظائف


الوصول إلى التعليقات التوضيحية المميزة


بعد التجميع ، تصبح التعليقات التوضيحية للوظائف متاحة من خلال السمة __التعليقات _. هذه السمة عبارة عن قاموس قابل للتغيير يقارن أسماء المتغيرات وقيم التعليقات التوضيحية المشار إليها.

يحتوي قاموس __التعليقات ___ على مفتاح "رجوع" خاص. هذا المفتاح موجود فقط إذا تم تحديد تعليق توضيحي للقيمة المرجعة للدالة. على سبيل المثال ، التعليق التوضيحي التالي:

def foo (a: 'x', b: 5 + 6, c: list) -> max (2, 9):
    ...

سيتم إرجاعه عبر سمة __التعليقات ___ على النحو التالي:

{'a': 'x',
 'b': 11,
 'c': list,
 'return': 9}

تم اختيار اسم المفتاح "return" لأنه لا يمكن أن يتعارض مع اسم المعلمة (أي محاولة لاستخدام الإرجاع حيث سيؤدي اسم المعلمة إلى استثناء SyntaxError).

ستكون السمة __التعليقات__ فارغة إذا لم يكن للدالة تعليقات توضيحية أو إذا تم إنشاء الوظيفة من خلال تعبير لامدا.

استخدم حالات


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

  • توفير معلومات النوع
    • اكتب الاختيار
    • نصائح IDE حول أنواع الوسيطة المتوقعة والمرتجعة
    • دالة التحميل الزائد / الوظائف العامة [تقريبا. يعد التحميل الزائد للدالة شائعًا بلغات أخرى ويتكون من وجود العديد من الوظائف بنفس الأسماء ، ولكن في نفس الوقت ، يختلف عدد المعلمات التي تقبلها]
    • الجسور بين لغات البرمجة المختلفة
    • التكيف
    • دالات المنطق المسند
    • تعيين استعلام قاعدة بيانات
    • تنظيم معلمات RPC [تقريبًا. التنظيم هو عملية تحويل المعلومات المخزنة في ذاكرة الوصول العشوائي إلى تنسيق مناسب للتخزين أو الإرسال. RPC - استدعاء الإجراء البعيد]
  • تقديم معلومات أخرى
    • توثيق المعلمات وقيم الإرجاع

مكتبة قياسية


Pydoc وتفتيش الوحدات النمطية


ستعرض وحدة pydoc التعليقات التوضيحية في معلومات مرجع الوظيفة. ستتغير وحدة الفحص وستدعم التعليقات التوضيحية.

رابط إلى أشخاص آخرين


كائنات التوقيع الدالة


يجب أن توفر كائنات توقيع الوظيفة التعليقات التوضيحية للوظيفة. قد يتغير كائن المعلمة وأشياء أخرى. [تقريبا. توقيع (توقيع) الوظيفة - جزء من إعلانها العام ، مما يسمح لوسائل الترجمة بتحديد الوظيفة من بين أمور أخرى]

التنفيذ


تم تضمين التنفيذ المرجعي في فرع py3k (المعروف سابقًا باسم "p3yk") كمراجعة 53170

العروض المرفوضة


  • BDFL [. ] , , : « »
  • stdlib , , . .
  • , , .
  • على الرغم من مزيد من المناقشة ، تقرر عدم توحيد آلية التفاعل مع التعليقات التوضيحية. مثل هذا الاتفاق في هذه المرحلة سيكون من السابق لأوانه. نريد أن نسمح لهذه الاتفاقات بالتطور عضوياً ، بناءً على موقف حقيقي ، ولا نحاول إجبار الجميع على استخدام نوع من المخطط المبتكر.

All Articles