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

من موسوعة حسوب
< Python
مراجعة 18:26، 1 مايو 2018 بواسطة عبد-الهادي-الديوري (نقاش | مساهمات) (إضافة الصّفحة)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

تُستعمَل الدّالة exec()‎ لتنفيذ شيفرة بايثون ديناميكيًّا.

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

exec(object[, globals[, locals]])

المعاملات

object

سلسلة نصيّة تُمثّل شيفرة بايثون المُراد تنفيذها أو كائن شيفرة كذلك الذي تُعيده الدّالة compile()‎.

إن كان سلسلةً نصيّة، فسيُعالج على أنّه جمل بايثون تُنفّذ (إلّا في حالة حدث خطأ في بنية الشّيفرة).

إن كان كائن شيفرة، فسيُنفّذ فقط. وعلى أية حال، يجب على الشّيفرة المرغوب تنفيذها أن تكون شيفرة بايثون صالحة. وانتبه إلى أنّه لا يجوز استخدام الجملتين return و yield خارج تعريفات الدّوال حتى داخل سياق الشّيفرة المُمرّرة إلى الدّالة exec()‎.

globals

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

قاموس يُمثّل الكائنات العامّة التي ستُمرّر إلى قيمة المُعامل object.

إن مُرّر هذا المُعامل دون قيمة للمفتاح ‎_‎_‎builtins‎_‎_‎، فسيُدخل مرجع يُشير إلى قاموس الوحدة القياسيّة builtins كقيمة للمفتاح. هكذا يُمكن التّحكّم في أيّ من الكائنات المُضمّنة ستكون مُتاحة للشّيفرة المرغوب تنفيذها عبر إدخال قاموس ‎_‎_‎builtins‎_‎_‎ خاصّ بك إلى المُعامل globals قبل تمريره إلى الدّالة exec()‎.

locals

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

قاموس أو كائن اقتران (mapping) يُمثّل الكائنات التي ستُمرّر إلى قيمة المُعامل object.

إن لم تُمرّر قيمة لهذا المُعامل، فستكون قيمته هي قيمة القاموس globals.

القيمة الافتراضيّة للمُعامل locals تتصرّف كما هو موضّح في صفحة الدّالة locals()‎، ويجب ألا تحاول تعديل قاموس locals الافتراضيّ. مرّر قاموسًا صريحًا إلى هذا المُعامل إن أردت أن ترى تأثيره على الكائنات المحليّة في الشّيفرة بعد تنفيذ الشّيفرة بالدّالة exec()‎.

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

القيمة None.

إن لم تُمرّر قيمة لكلّ من المُعامل globals والمُعامل locals فستُنفّذ الشّيفرة في البيئة التي استُدعيَت فيها الدّالة.

تُطلق استثناءات إن كانت هناك أخطاء في بنية الشّيفرة.

إن استدعيت الدّالة على كائن شيفرة جُمّع بالنّمط ‎'‎exec‎'‎ (انظر الدّالة compile)، فستُساوي نتيجة الدّالة eval()‎ القيمةNone.


أمثلة

المثال التّالي يوضّح كيفيّة عمل هذه الدّالة:

>>> exec("if True: print('Hi!')") # جملة شرطيّة بشرط صحيح
Hi!
>>> exec("if False: print('Hi!')") # جملة شرطيّة بشرط خاطئ
>>> exec('def add(x, y):' # إنشاء دالّة ديناميكيًّا
...      '    return x + y')
>>> add(1, 2) # استعمال الدّالة كما لو أنّنا عرّفناها مُباشرة
3

ملاحظات

  • تُعيد الدّالتان globals()‎ وlocals()‎، على التّوالي، القاموس العامّ والقاموس المحليّ الحاليّ، يُمكن تمرير هاذين القاموسين إلى الدّالة eval()‎ أو الدّالة exec()‎.
  • تذكّر أنّه على مستوى الوحدة (module)، القاموسان globals وlocals مُتطابقان.
  • إن كان القاموس globals مُخالفًا للقاموس locals فستُنفّذ الشّيفرة كأنّها داخل تعريف صنف.

انظر أيضًا

مصادر