كيفية استخدام التحقق من النوع الثابت في بيثون 3.6

التقاط العديد من الأخطاء الشائعة تلقائيًا أثناء الترميز

واحدة من أكثر الشكاوى شيوعًا حول لغة بايثون هي أن المتغيرات مكتوبة ديناميكيًا. هذا يعني أنك تعلن المتغيرات دون منحهم نوع بيانات محدد. يتم تحديد الأنواع تلقائيًا بناءً على البيانات التي تم تمريرها بها:

في هذه الحالة ، يتم إنشاء متغير president_name كنوع str لأننا مررنا في سلسلة. لكن بيثون لم تكن تعلم أنها ستكون سلسلة حتى يتم تشغيلها في الواقع هذا السطر من الشفرة.

وبالمقارنة ، فإن لغة مثل Java تُطبع بشكل ثابت. لإنشاء المتغير نفسه في Java ، يجب عليك إعلان السلسلة بشكل صريح بنوع سلسلة:

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

لماذا يجب أن أهتم بالأنواع؟

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

فيما يلي مثال لنوع شائع بشكل لا يصدق في بيثون:

كل ما نفعله هو مطالبة المستخدم باسمه ثم طباعة "مرحبًا ، <الاسم الأول>!". وإذا لم يقم المستخدم بكتابة أي شيء ، فنحن نريد طباعة "مرحبًا ، اسم مستخدم!"

سيعمل هذا البرنامج بشكل مثالي إذا قمت بتشغيله واكتب اسمًا ... ولكن سيتعطل إذا تركت الاسم فارغًا:

تتبع (آخر مكالمة أخيرة):
  ملف "test.py" ، السطر 14 ، في 
    first_name = get_first_name (fallback_name)
  ملف "test.py" ، السطر 2 ، في get_first_name
    إرجاع full_name.split ("") [0]
AttributeError: كائن "dict" لا يحتوي على سمة "split"

المشكلة هي أن fallback_name ليس سلسلة - إنه قاموس. لذا فشل استدعاء get_first_name على fallback_name بشكل فظيع لأنه لا يحتوي على وظيفة .split ().

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

الكتابة الثابتة يمنع هذا النوع من الأخطاء. قبل أن تحاول تشغيل البرنامج ، ستخبرك الكتابة الثابتة أنه لا يمكنك تمرير اسم backback_name إلى get_first_name () لأنه يتوقع سلسلة لكنك تمليه. يستطيع محرر الكود إبراز الخطأ أثناء الكتابة!

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

والخبر السار هو أنه يمكنك الآن استخدام الكتابة الثابتة في بيثون إذا كنت ترغب في ذلك. وكما في Python 3.6 ، هناك أخيرًا بناء جملة عاقل لإعلان الأنواع.

إصلاح برنامج عربات التي تجرها الدواب لدينا

دعونا نقوم بتحديث برنامج عربات التي تجرها الدواب عن طريق الإعلان عن نوع كل متغير وكل وظيفة الإدخال / الإخراج. إليك الإصدار المحدّث:

في Python 3.6 ، تعلن عن نوع متغير مثل هذا:

variable_name: النوع

إذا كنت تقوم بتعيين قيمة مبدئية عند إنشاء المتغير ، فستكون بهذه البساطة:

my_string: str = "قيمة السلسلة الخاصة بي"

وتعلن عن أنواع المدخلات والمخرجات الخاصة بالوظيفة مثل هذا:

def function_name (معلمة 1: type) -> return_type:

الأمر بسيط للغاية - مجرد قرص صغير إلى صيغة بيثون العادية. ولكن الآن بعد الإعلان عن الأنواع ، انظر إلى ما يحدث عند تشغيل مدقق النوع:

$ mypy typing_test.py
test.py:16: error: الوسيطة 1 إلى "get_first_name" لديها نوع غير متوافق Dict [str، str]؛ المتوقع "شارع"

دون حتى تنفيذ البرنامج ، فإنه يعرف أنه لا توجد طريقة تعمل هذا السطر 16! يمكنك إصلاح الخطأ الآن دون انتظار قيام المستخدم باكتشافه بعد ثلاثة أشهر من الآن.

وإذا كنت تستخدم IDE مثل PyCharm ، فسوف يتحقق تلقائيًا من الأنواع ويظهر لك مكان الخطأ قبل أن تصل إلى "Run":

انه من السهل!

المزيد من أمثلة بيثون 3.6

إعلان المتغيرات str أو int بسيط. يحدث الصداع عند العمل مع أنواع بيانات أكثر تعقيدًا مثل القوائم المتداخلة والقواميس. لحسن الحظ بيثون 3.6 بناء جملة جديد لهذا ليس سيئا للغاية - على الأقل ليس للغة التي أضافت الكتابة كفكرة لاحقة.

النمط الأساسي هو استيراد اسم نوع البيانات المعقدة من وحدة الطباعة ثم تمرير الأنواع المتداخلة بين قوسين.

أنواع البيانات المعقدة الأكثر شيوعًا التي تستخدمها هي Dict و List و Tuple. إليك ما يبدو أنه استخدامها:

من كتابة استيراد Dict ، قائمة
# قاموس حيث المفاتيح هي سلاسل والقيم ints

name_counts: Dict [str، int] = {
    "آدم": 10 ،
    "غيدو": 12
}
# قائمة الأعداد الصحيحة

الأرقام: القائمة [int] = [1 ، 2 ، 3 ، 4 ، 5 ، 6]
# قائمة تحتوي على رسومات تحتوي كل منها على قيمة مفتاح سلسلة / int

list_of_dicts: قائمة [Dict [str، int]] = [
    {"key1": 1} ،
    {"key2": 2}
]

Tuples مميزة بعض الشيء لأنها تتيح لك إعلان نوع كل عنصر على حدة:

من كتابة استيراد Tuple

my_data: Tuple [str، int، float] = ("Adam"، 10، 5.7)

يمكنك أيضًا إنشاء أسماء مستعارة للأنواع المعقدة فقط عن طريق تعيينها لاسمًا جديدًا:

من كتابة قائمة الاستيراد ، Tuple

LatLngVector = قائمة [Tuple [تعويم ، تعويم]]

النقاط: LatLngVector = [
    (25.91375 ، -60.15503) ،
    (-11.01983 ، -166.48477) ،
    (-11.01983 ، -166.48477)
]

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

يدعم Python 3.6 أيضًا بعض عناصر الكتابة الهائلة التي قد تراها في لغات البرمجة الأخرى مثل الأنواع العامة والأنواع المخصصة المعرفة من قبل المستخدم.

تشغيل النوع مدقق

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

  1. قم بتنزيل مدقق نوع mypy مفتوح المصدر وقم بتشغيله كجزء من اختبارات الوحدة أو سير عمل التطوير.
  2. استخدم PyCharm الذي يحتوي على فحص مدمج في IDE. أو إذا كنت تستخدم محررًا آخر مثل Atom ، فقم بتنزيل مكون التحقق من النوع الخاص به.

أوصي بالقيام بالأمرين يستخدم PyCharm و mypy تطبيقات مختلفة للتحقق من النوع ويمكنهما التقاط أشياء لا يفعلها الآخر. يمكنك استخدام PyCharm لفحص النوع الفعلي ثم تشغيل mypy كجزء من اختبارات الوحدة الخاصة بك كتحقق نهائي.

عظيم! هل يجب علي البدء في كتابة كل شفرة بايثون الخاصة بي مع إعلانات النوع؟

بناء جملة تعريف النوع هذا جديد جدًا على Python - إنه يعمل تمامًا اعتبارًا من Python 3.6. إذا عرضت رمز Python المكتوب على مطور Python آخر ، فهناك فرصة جيدة لأن يظن أنك مجنون ولا تعتقد أن بناء الجملة صالح. ولا يزال مدقق أنواع mypy قيد التطوير ولا يدعي أنه ثابت حتى الآن.

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

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

شكرا للقراءة! إذا كنت مهتمًا بالتعلم الآلي (أو تريد فقط أن تفهم ما هو عليه) ، فتحقق من أن "التعلم الآلي" هو برنامج Fun! سلسلة.

يمكنك أيضًا متابعتني على Twitter علىageitgey أو العثور علي على linkin.