ستساعدك المقالة التالية: سطر واحد يتحقق من أنواع المدخلات لوظائفك في وقت التشغيل – نحو الذكاء الاصطناعي
نُشر في الأصل في Towards AI.
مع شرح التعليمات البرمجية المصدر والتنفيذ
Note: هذه المقالة جزء من سلسلتي “تقنيات وأدوات بسيطة لعلوم البيانات” ، وهي عبارة عن مجموعة من الأدوات القوية التكميلية. هذا المقال مبني على: mypy 0.991 pydantic 1.10.2 beartype 0.11.0.
1. اكتب تلميحات
إذا كنت معتادًا بالفعل على تلميحات الكتابة ، فلا تتردد في تخطي هذا القسم ؛ ولكن في حالة عدم قيامك بذلك ، سأشرح ذلك بمثال بسيط.
تتطلب معظم اللغات الثابتة مثل Java وسيطة وأنواع الإرجاع ليتم تحديدها للوظائف.
هنا في وظيفة Java addTwoNums ، نعلم أن الوسيطتين num1 num2 والعودة كلها تمت كتابتها بطريقة int. في ما يعادل Python ، يمكننا التصريح عن الأنواع في docstring أو التوثيق.
ومع ذلك ، هناك طريقة أكثر أصالة لتعريفها – تلميحات الكتابة.
كما يوضح الكود أعلاه ، يمكننا تحديد أنواع الوسائط والعودة باستخدام تلميحات الكتابة (: للوسيطات و -> للإرجاع) ، لذلك لا نحتاج إلى كتابتها مرة أخرى في docstring.
يعد تلميح الكتابة ميزة جديدة نسبيًا وقد تم تقديمه في Python 3.5. هناك نقاشات حول ما إذا كان يجب استخدام تلميحات الكتابة أم لا لأنه ، بعد كل شيء ، Python هي لغة مكتوبة ديناميكيًا ، والأنواع لا يتم فرضها بأي حال من الأحوال. أنا شخصياً أعتقد أنه من الممارسات الجيدة إضافة تلميحات الكتابة ، حيث إنها لا تعمل فقط على تحسين قابلية قراءة الكود وتسهيل التوثيق ، ولكنها تسمح أيضًا بإجراء فحوصات متنوعة متعلقة بالنوع ، كما سأقدم أدناه ، وأنا أستخدم تلميحات الكتابة في عملي.
2. التحقق من أنواع المدخلات مقابل تلميحات الكتابة
هناك العديد من الأدوات التي تسمح لنا بالتحقق من الكود بناءً على تلميحات الكتابة.
2.1. المدقق الثابت
كما يوحي الاسم ، يقوم مدقق النوع الثابت بفحص الكود الخاص بك بشكل ثابت ، وبعبارة أخرى ، يتحقق من أنواع الإدخال لوظائفك إذا كانت استدعاءات الوظائف هذه موجودة بالفعل في قاعدة الشفرة الخاصة بك.
ربما تكون MyPy (14.4 ألف نجمة على GitHub) هي الأداة الأكثر شيوعًا من هذا النوع ، مع بعض البدائل ، بما في ذلك Pyright و Pytype و Pyre.
على سبيل المثال ، إذا كان لدينا نص برمجي يستدعي وظيفة مع تلميحات الكتابة ولكن بها أنواع إدخال غير صالحة:
Mypy قادر على مسح البرامج النصية واكتشاف أخطاء الكتابة. ومع ذلك ، إذا تم استدعاء الوظيفة في وقت التشغيل ، فلن يتمكن mypy من التحقق منها.
2.2. مدقق وقت التشغيل
بافتراض أننا نطور حزمة Python للفريق ، ونريد التحقق من أنواع المدخلات لوظائفنا في وقت التشغيل عندما يستخدمها الزملاء ، يمكننا ببساطة إضافة مصمم Validate_arguments من Pydantic (12k stars على GitHub) إلى وظيفتنا.
الأمثلة واضحة تمامًا ، ويمكننا أن نرى أن المصمم يتحقق من المدخلات مقابل تلميحات الكتابة ويثير خطأ التحقق من الصحة إذا كانت الأنواع غير متطابقة.
Pydantic ليس الوحيد الذي يوفر هذه الوظيفة ؛ هناك مصممون آخرون يحققون نفس الشيء ، مثل beartype (1.4 ألف نجمة على GitHub).
ومع ذلك ، من الواضح أن رسائل خطأ beartype ليست مقروءة مثل تلك الواردة من pydantic.
3. السماح بأنواع عشوائية مع pydantic
بشكل افتراضي ، لا يدعم مصمم Validate_arguments سوى أنواع Python المضمنة ، ولكن غالبًا ما نرغب في تمرير Pandas DataFrame كوسيطة ، ويمكننا القيام بذلك عن طريق السماح بأنواع عشوائية في التكوين على النحو التالي:
تُرجع دالة المثال هذه ببساطة الصفوف n الأولى من إطار البيانات ، ويمكننا أن نرى من الأمثلة أن مصمم Validate_arguments يمكنه الآن التحقق من صحة نوع pd.DataFrame أيضًا.
تحذير: كما هو مذكور في الوثائق الرسمية ، فإن مصمم Validate_arguments موجود بيتا، تمت إضافته إلى pydantic في الإصدار 1.5 على أساس مؤقت. قد يتغير في الإصدارات المستقبلية ولن تكون واجهته ملموسة حتى الإصدار 2.
4. (اختياري) كيف يعمل
إذا كنت مستخدمًا متوسطًا إلى متقدمًا لـ Python ، فإن القسمين الأخيرين مناسبين لك!
في حين أن التفصيل التفصيلي للشفرة المصدر هو بالتأكيد خارج نطاق هذه المقالة ، فلنلقِ نظرة على القطعتين الأساسيتين في اللغز: تلميحات الكتابة ومدخلات المستخدم.
4.1 تلميحات نوع الوصول من سمة الوظيفة
إذا كانت لدينا وظيفة مع تلميحات الكتابة ، فيمكننا الوصول إلى معلومات النوع في سمة __التعليقات__ الخاصة بالوظيفة. على سبيل المثال:
ويستخدم هذا في وظيفة _typing_extra.get_type_hints في pydantic.
4.2 الوصول إلى تلميحات من توقيع الوظيفة
يمكننا أيضًا الوصول إلى التعليقات التوضيحية من توقيع الوظيفة باستخدام وحدة الفحص المضمنة في Python. على سبيل المثال:
يستخدم هذا أيضًا في فئة ValidatedFunction في pydantic.
4.3 الوصول إلى مدخلات المستخدم في الديكور
سيكون من السهل فهم ذلك إذا كان لديك خبرة مع مصممي بايثون. باختصار ، يعتبر المصمم (في الغالب) وظيفة تأخذ وظيفة أخرى كمدخل لها ، ويفعل شيئًا حيالها ، ثم يعيد الوظيفة الأصلية. يمكننا استخدام رمز @ لإضافة مصمم إلى وظيفة ، ولكن هذا يعني في الحقيقة أن المصمم يأخذ الوظيفة كمدخل لها ، والطريقتان أدناه (السطر 13 والخط 19 – مع أو بدون الرمز @) متكافئة.
في هذا المثال البسيط ، يقوم my_decorator بطباعة رسالة قبل وبعد تنفيذ وظيفة الترحيب الأصلية. بدون الخوض في مزيد من التفاصيل حول المصممين ، فإن المهم هنا هو أن جميع الحجج (args و kwargs ، في هذا المثال ، “John”) للوظيفة الأصلية يتم إدخالها أيضًا في مصمم الديكور نفسه ، وبهذه الطريقة يمكننا الحصول على المستخدم المدخلات.
5. (متقدم) دعونا ننفذ منطقتنا!
بعد أن تعلمت الأجزاء الأساسية لمصمم Validate_arguments ، فلماذا لا نطبق نسخة مبسطة خاصة بنا؟
ممتاز! لقد قمنا الآن بتنفيذ أداة تزيين Validate_arguments بأنفسنا ، وكما يمكننا أن نرى من الأمثلة المقدمة ، فإنها تعمل تمامًا كما نتوقع. بعض النقاط الرئيسية هنا:
- أولاً ، نستخدم التوقيع (func). معلمات (السطر 9) للحصول على أسماء وأنواع الوسيطات المتوقعة
- ثم نستخدم التوقيع (func).ربط(* args ، ** kwargs) (الأسطر 12-14) لقراءة جميع أسماء وقيم المعلمات لاستدعاء الوظيفة ، بما في ذلك الوسائط ، وسيطات الكلمات الرئيسية ، والقيم الافتراضية
- أخيرًا ، تحقق من جميع قيم الإدخال مقابل الأنواع المتوقعة ، واستدع الوظيفة الأصلية إذا كانت جميع الأنواع صالحة ، وإلا قم برفع خطأ TypeError (الأسطر 19-24)
ربما لاحظت مصمم الديكورwraps من functools (وحدة Python المدمجة) في السطر 6 ، والذي ظهر أيضًا في لقطة الشاشة الثالثة لشفرة المصدر pydantic أعلاه. يقوم بشكل أساسي بنسخ البيانات الوصفية (الاسم ، سلسلة المستندات ، التعليقات التوضيحية ، إلخ) للوظيفة الأصلية في الغلاف حتى نتمكن من الاحتفاظ بالمعلومات في وظيفتنا الأصلية بعد تزيينها ، وهي ممارسة جيدة عند تطوير الديكور. وفي السطور 62-65 ، يمكننا أن نرى أن البيانات الوصفية مثل __doc__ ، __التعليقات__ سمات دالة get_dataframe_head المزخرفة يتم الاحتفاظ بها ، بدلاً من الحصول على البيانات الوصفية للغلاف.
بالطبع ، لا أتوقع أن يتفوق تطبيقي المبسط على تطبيق pydantic ، وهو أكثر تفصيلاً وقد تم اختباره مع العديد من الحالات المتطورة ، ولكن مع ذلك ، آمل أن تكون قد وجدت هذا مفيدًا وتعلمت شيئًا جديدًا أو اكتسبت بعض الإلهام.
ترميز سعيد!
و
تم نشر سطر واحد يتحقق من صحة أنواع المدخلات لوظائفك في وقت التشغيل في الأصل في Towards AI on Medium ، حيث يواصل الأشخاص المحادثة من خلال تسليط الضوء على هذه القصة والرد عليها.
تم النشر عبر نحو الذكاء الاصطناعي