النطاق والمعطيات
حدود تعريف المعرَّفات
ومن خصائص الدالة أن أي اسم يتم تعريفه داخل الدالة فإنه معروفٌ في نطاقها لا في الخارج.
فنتوقع وقوع خطأ هنا لأن bmi غير معرَّفة في الخارج:
تقول رسالة الخطأ (السطر الأخير) أن المتغير bmi غير معرَّف. وهذا منطقي لأن النطاق الخارجي لا يعلم ما تكنه النطاقات الداخلية الخاصة بالدوال. وهو أمر مطلوب جدًّا ومرغوب في البرمجة. وذلك يعني أننا لن نتعب كثيرًا في اختيار الأسماء داخل كل دالة، مخافة التعارض.
مجال نطاق التسمية
إذا اتفق متغيران في الاسم فقد يختلفان في المسمى، والقريب أوْلى من البعيد على هذا النحو:
مستويات النطاقات (Scopes) من الداخل إلى الخارج:
- النطاق المحلي (Local Scope): المتغيرات المعرفة داخل دالة.
- النطاق المحيط (Enclosing Scope): المتغيرات المعرفة في دالة تتحوي تلك الدالة.
- النطاق العام (Global Scope): المتغيرات المعرفة خارج جميع الدوال.
- النطاق المبني (Built-in Scope): الدوال المبنية في بايثون مثل
print().
فهو كاستعمال الضمائر في اللغة. وحتى نتفادى اللبس: اجعل استعمال المتغير تاليًا لأخص نطاق له.
معطيات من النطاق المحيط
وعلى العكس فإن المعرَّفات الخارجة معروفة في الداخل؛ وذلك يعني أنها يمكن أن تعمل في الدالة بشكل غير مباشر. أي أنها معطيات غير مصرَّح بها (هو: max_length في هذا المثال):
معطيات غير واجبة
الأصل في المعطيات المعرَّفة الوجوب. فلو أهملت أحدها فإنك ستواجه بالخطأ:
تقول رسالة الخطأ (السطر الأخير) أن الدالة تفتقد معطىيْن موضعيين إلزاميين، وهما: humidity و wind_speed.
فلو أردنا أن يكون عمل الدالة بحسب أحد المعطيات بالتعيين، على نحو:
- لو عينت السلزيوس فالتحويل لفهرنهايت:
convert_temperature(celsius=32) - لو عينت الفهرنهايت فالتحويل لسلزيوس:
convert_temperature(fahrenheit=89.6)
وإليك معادلة التحويل بين نوعيْ درجة الحرارة:
فأي معطى نعرفه بقيمة افتراضية فإن بايثون تعتبره اختياريًّا، ولو بالقيمة العدميَّة None. فنعرِّفُ المعطيات بقيَم عدميَّة، ونفحص وجودها بالشرط is not None لنُعمِلَها أو نهملها:
نتأكد:
ذكر أنواع المعطيات في الدالة
تسمح بايثون بعدم التصريح بأنواع المعاملات إلا أنه يحسُن التصريح بها حصرًا لتوضيح ما تقبل وما تخرج:
- بعد النقطتين رأسيتين (
:) للمدخلات - وبعد السهم (
->) للمخرجات
ومن الأنواع المبنيَّة في بايثون:
intالأعداد الصحيحة، نحو:10floatالأعداد العشرية، نحو:10.5strوهي نوع النص، نحو:"Salam"
للاستزادة راجع: MyPy Type hints cheat sheet.
مثال: دالة فحص قوة كلمة المرور
وإليك مثالاً آخر لدالة تتحقق من قوة كلمة المرور:
لاحظ أننا استعملنا الدالة المبنية len() لحساب عدد الأحرف في النص.
ثم نستعمل دالتنا: