الدالة ‎‎__import__()‎ في بايثون

من موسوعة حسوب

تسترِد الدّالة ‎__‎‎import‎‎_‎_‎()‎‎ الوحدة المُعطاة.

ملاحظة: هذه الدّالة مُتقدّمة غير مطلوبة في برمجة بايثون الاعتياديّة، على عكس الدّالة importlib.import_module.

تستدعي الجملة import‎ الدّالةَ ‎__import__()‎ ويُمكن استبدالها عبر استيراد builtins وتعيين دالّة جديدة للخاصيّة ‎builtins‎.‎_‎_‎import‎_‎_‎‎ إن أردت تغيير كيفيّة تصرّف الجملة import‎، لكنّ هذا الأمر غير منصوح به بشدّة إذ عادةً ما تكون خُطّافات الاستيراد (انظر PEP 302) وسيلةً أكثر بساطة للوصول إلى نفس الغاية ولا تُسبّب مشاكل مع الشّيفرة التي تعتمد على كون آليّة الاستيراد طبيعيّة دون تغيّر. واستعمال الدّالة ‎__import__()‎ مُباشرةً غير منصوح به كذلك، استعمل الدّالة ‎importlib‎.‎import_module‎(‎)‎ عوضًا عنها.

البنية العامة

__import__(name, globals=None, locals=None, fromlist=(), level=0)

المعاملات

name

سلسلة نصيّة تُمثّل اسم الوحدة المرغوب استيرادها.

globals

مُعامل اختياريّ.

الكائنات العامّة التي تُحدّد كيفيّة تفسير الاسم في سياق حزمةٍ (package context) مُعيّنة.

locals

مُعامل اختياريّ.

الكائنات المحليّة التي تُحدّد كيفيّة تفسير الاسم في سياق حزمةٍ مُعيّنة. آليّة العمل القياسيّة لا تستخدم أبدًا هذا المُعامل، وتستخدم المُعامل globals فقط لتحديد سياق حزمة جملة الاستيراد import‎.

fromlist

مُعامل اختياريّ.

قائمة تحتوي على أسماء الكائنات أو الوحدات الفرعيّة التي يجب استيرادها من الوحدة المُعطى اسمُها للمُعامِل name.

level

مُعامل اختياريّ.

يُحدّد ما إذا كان الاستيراد مُطلقًا أو نسبيًّا. القيمة الافتراضيّة 0 تعني أنّ الاستيرادات ستكون مطلقةً حصرًا. القيم الموجبة تُشير إلى عدد المُجلّدات الآباء التي ستُبحَث نسبةً إلى مُجلّد الوحدة التي تستدعي الدّالة ‎__import__()‎ (انظر PEP 328 للاستزادة).

القيمة المعادة

الوحدة المُستوردة.

إن كان المُعامل name على شكل package.module، فستُعاد عادةً الحزمة العلويّة إلى أوّل نقطة (أي package في هذه الحالة)، ولن تُعاد الوحدة المُعطاة للمُعامل name (أي package.module في هذه الحالة). لكن عندما لا تكون قيمة المُعامل fromlist فارغة، فستُعاد الوحدة ذات الاسم المُعطى للمُعامل name (انظر الأمثلة).

أمثلة

على سبيل المثال، الجملة import spam تُنتج شيفرة بايتات (bytecode) مُشابهة للشّيفرة التّالية:

spam = __import__('spam', globals(), locals(), [], 0)

أمّا الجملة import spam.ham فتُنتج الاستدعاء التّالي:

spam = __import__('spam.ham', globals(), locals(), [], 0)

لاحظ كيف أنّ الدّالة ‎__import__()‎ تُعيد الوحدة العليا (spam في هذه الحالة) لأنّها هي الكائن المُرتبط باسمٍ من طرف الجملة import هنا.

أمّا الجملة from spam.ham import eggs, sausage as saus فستُنتج ما يلي:

_temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], 0)
eggs = _temp.eggs
saus = _temp.sausage

في هذا المثال، تُعاد الوحدة spam.ham من استدعاء الدّالة ‎__import__()‎. ويُحصَل على الأسماء المُراد استيرادها من الكائن المُعاد.

ملاحظات

إن أردت استيراد وحدة (قد تكون داخل حزمة) باسمها ببساطة، استعمل الدّالة importlib.import_module.

انظر أيضًا

مصادر