استيراد الأسماء

7.2 استيراد الأسماء

أهداف التعلم

في نهاية هذا القسم، ينبغي أن تكون قادرًا على

  • استيراد الدوال من وَحدة باستخدام الكلمة المفتاحية from.
  • شرح كيفية تجنب تعارض الأسماء عند استيراد وَحدة.

الكلمة المفتاحية from

يمكن استيراد دوال محددة من وَحدة باستخدام الكلمة المفتاحية from:

    from area import triangle, cylinder

يمكن استدعاء هذه الدوال مباشرة، دون الإشارة إلى الوَحدة:

    print(triangle(1, 2))
    print(cylinder(3, 4))

استكشاف إضافي

كما هو موضح أدناه، يمكن أن تؤدي الكلمة المفتاحية from إلى أسماء مربكة.

نقطة تحقق

استيراد الدوال

مفاهيم تطبيقية

الكلمة المفتاحية from

1.
ما تعليمة الاستيراد المطلوبة قبل تشغيل print(sqrt(25))؟
  1. from math import sqrt
  2. import sqrt from math
  3. import math
2.
كم عدد المُتغيِّرات التي تُعرّفها التعليمة from math import sin, cos, tan؟
  1. 0
  2. 3
  3. 4
3.
ما الخطأ الذي سيحدث عند محاولة استدعاء دالّة لم تُستورَد؟
  1. ImportError
  2. NameError
  3. SyntaxError

تعارض الأسماء

قد تستخدم الوَحدات التي يكتبها مبرمجون مختلفون نفس الاسم لدالّة. يحدث تعارض الأسماء (name collision) عندما تُعرّف دالّة عدة مرات. إذا عُرِّفت دالّة أكثر من مرة، يُستخدَم التعريف الأحدث:

    from area import cube

    def cube(x):    # تعارض أسماء (يستبدل الدالّة المستوردة)
      return x ** 3
    
    print(cube(2)) # تستدعي دالّة cube() المحلية، وليس area.cube()

قد لا يدرك المبرمج أن الدالّة cube مُعرّفة مرتين لأنه لا يحدث خطأ عند تشغيل البرنامج. لا تُعتبر تعارضات الأسماء أخطاءً وغالبًا ما تؤدي إلى سلوك غير متوقع.

يجب توخي الحذر لتجنب تعارض الأسماء. استيراد دوال محددة من وَحدة يقلّل من استهلاك الذاكرة؛ لكن استيراد الوَحدة كاملةً يساعد في تجنب التعارضات لأنه يُستخدَم تنسيق module.name. هذه مفاضلة يجب على المبرمج أخذها في الاعتبار.

نقطة تحقق

أسماء الوَحدات والدوال

مفاهيم تطبيقية

تعارض الأسماء

4.
يبدأ برنامج بـ from area import square, circle. ما الشِفرة التي تسبب تعارضًا في الأسماء؟
  1. def area(phone):
      """Gets the area code of a phone number."""
    
  2. def circle(x, y, size):
      """Draws a circle centered at (x, y)."""
    
  3. def is_square(length, width):
      """Returns True if length and width are equal."""
    
5.
يبدأ برنامج بـ import area. ما الشِفرة التي تسبب تعارضًا في الأسماء؟
  1. area = 51
    
  2. import cylinder from volume
    
  3. def cube(size):
      """Generates a "size X size" rubik's cube."""
    
6.
أي سطر سيسبب خطأ؟
1
def hello():
2
  print("Hello!")
3
4
def hello(name):
5
  print("Hello,", name)
6
7
hello()
8
hello("Chris")
  1. السطر 4
  2. السطر 7
  3. السطر 8

استكشاف إضافي

إذا تم تعريف اسم أو استيراده أو إسناده عدة مرات، فإن بايثون تستخدم التعريف الأحدث. تسمح لغات أخرى بتعدد الدوال التي تحمل نفس الاسم إذا كانت المُعامِلات مختلفة. هذه الميزة، المعروفة باسم التحميل الزائد للدوال (function overloading)، ليست جزءًا من لغة بايثون.

جرّب بنفسك

استيرادات مفقودة

أضف تعليمات الاستيراد المفقودة إلى أعلى الملف. لا تُجرِ أي تغييرات على بقية الشِفرة. في النهاية، يجب أن يعمل البرنامج بدون أخطاء.

جرّب بنفسك

هدايا الحفلات

البرنامج التالي لا يعمل بشكل صحيح بسبب تعارض الأسماء. أصلح البرنامج عن طريق تعديل تعليمات الاستيراد، واستدعاءات الدوال، وإسنادات المُتغيِّرات. يجب أن يكون الإخراج كالتالي:

    Bouncy ball area: 13
    Bouncy ball volume: 4
    Cone hat area: 227
    Cone hat volume: 209