الفرق بين المراجعتين لصفحة: «Python/exec»
إضافة الصّفحة |
ط ←object |
||
(5 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 9: | سطر 9: | ||
== المعاملات == | == المعاملات == | ||
=== <code>object</code> === | === <code>object</code> === | ||
سلسلة نصيّة تُمثّل شيفرة بايثون المُراد تنفيذها أو كائن شيفرة كذلك الذي تُعيده الدّالة <code>compile()</code>. | سلسلة نصيّة تُمثّل شيفرة بايثون المُراد تنفيذها أو كائن شيفرة كذلك الذي تُعيده الدّالة <code>[[Python/compile|compile()]]</code>. | ||
إن كان سلسلةً نصيّة، | إن كان سلسلةً نصيّة، فستُعالج على أنّها جمل بايثون عاديّة وستُنفّذ (إلّا في حالة حدث خطأ في بنية الشّيفرة). | ||
إن كان | إن كان كائنَ شيفرة، فسيُنفّذ فقط. وعلى أية حال، يجب على الشّيفرة المرغوب تنفيذها أن تكون شيفرة بايثون صالحة. وانتبه إلى أنّه لا يجوز استخدام الجملتين <code>return</code> و <code>yield</code> خارج تعريفات الدّوال حتى داخل سياق الشّيفرة المُمرّرة إلى الدّالة <code>exec()</code>. | ||
=== <code>globals</code> === | === <code>globals</code> === | ||
سطر 20: | سطر 20: | ||
قاموس يُمثّل الكائنات العامّة التي ستُمرّر إلى قيمة المُعامل <code>object</code>. | قاموس يُمثّل الكائنات العامّة التي ستُمرّر إلى قيمة المُعامل <code>object</code>. | ||
إن مُرّر هذا المُعامل دون قيمة للمفتاح <code>__builtins__</code>، فسيُدخل مرجع يُشير إلى قاموس الوحدة القياسيّة builtins كقيمة للمفتاح. هكذا يُمكن التّحكّم في أيّ من الكائنات المُضمّنة ستكون مُتاحة للشّيفرة المرغوب تنفيذها عبر إدخال قاموس <code>__builtins__</code> خاصّ بك إلى المُعامل <code>globals</code> قبل تمريره إلى الدّالة <code>exec()</code>. | إن مُرّر هذا المُعامل دون قيمة للمفتاح <code>__builtins__</code>، فسيُدخل مرجع يُشير إلى قاموس الوحدة القياسيّة <code>[[Python/builtins|builtins]]</code> كقيمة للمفتاح. هكذا يُمكن التّحكّم في أيّ من الكائنات المُضمّنة ستكون مُتاحة للشّيفرة المرغوب تنفيذها عبر إدخال قاموس <code>__builtins__</code> خاصّ بك إلى المُعامل <code>globals</code> قبل تمريره إلى الدّالة <code>exec()</code>. | ||
=== <code>locals</code> === | === <code>locals</code> === | ||
سطر 29: | سطر 29: | ||
إن لم تُمرّر قيمة لهذا المُعامل، فستكون قيمته هي قيمة القاموس <code>globals</code>. | إن لم تُمرّر قيمة لهذا المُعامل، فستكون قيمته هي قيمة القاموس <code>globals</code>. | ||
القيمة الافتراضيّة للمُعامل <code>locals</code> تتصرّف كما هو موضّح في صفحة الدّالة <code>locals()</code>، ويجب ألا تحاول تعديل قاموس <code>locals</code> الافتراضيّ. مرّر قاموسًا صريحًا إلى هذا المُعامل إن أردت أن ترى تأثيره على الكائنات المحليّة في الشّيفرة بعد تنفيذ الشّيفرة بالدّالة <code>exec()</code>. | القيمة الافتراضيّة للمُعامل <code>locals</code> تتصرّف كما هو موضّح في صفحة الدّالة <code>[[Python/locals|locals()]]</code>، ويجب ألا تحاول تعديل قاموس <code>locals</code> الافتراضيّ. مرّر قاموسًا صريحًا إلى هذا المُعامل إن أردت أن ترى تأثيره على الكائنات المحليّة في الشّيفرة بعد تنفيذ الشّيفرة بالدّالة <code>exec()</code>. | ||
== القيمة المعادة == | == القيمة المعادة == | ||
القيمة None. | القيمة <code>None</code> مع تنفيذ الشّيفرة المُعطاة. | ||
إن لم تُمرّر قيمة لكلّ من المُعامل <code>globals</code> والمُعامل <code>locals</code> فستُنفّذ الشّيفرة في البيئة التي استُدعيَت فيها الدّالة. | إن لم تُمرّر قيمة لكلّ من المُعامل <code>globals</code> والمُعامل <code>locals</code> فستُنفّذ الشّيفرة في البيئة التي استُدعيَت فيها الدّالة. | ||
تُطلق استثناءات إن كانت هناك أخطاء في بنية الشّيفرة. | تُطلق استثناءات إن كانت هناك أخطاء في بنية الشّيفرة. | ||
== أمثلة == | == أمثلة == | ||
المثال التّالي يوضّح كيفيّة عمل هذه الدّالة: | المثال التّالي يوضّح كيفيّة عمل هذه الدّالة: | ||
سطر 54: | سطر 50: | ||
== ملاحظات == | == ملاحظات == | ||
* تُعيد | * تُعيد الدّالة <code>[[Python/globals|globals()]]</code> القاموس العامّ الحاليّ وتُعيد <code>[[Python/locals|locals()]]</code> القاموس المحليّ الحاليّ، ويُمكن تمرير هاذين القاموسين إلى الدّالة <code>eval()</code> أو الدّالة <code>exec()</code>. | ||
* تذكّر أنّه على مستوى الوحدة (module)، القاموسان <code>globals</code> و<code>locals</code> مُتطابقان. | * تذكّر أنّه على مستوى الوحدة (module)، القاموسان <code>globals</code> و<code>locals</code> مُتطابقان. | ||
* إن كان القاموس <code>globals</code> مُخالفًا للقاموس <code>locals</code> فستُنفّذ الشّيفرة كأنّها داخل تعريف صنف. | * إن كان القاموس <code>globals</code> مُخالفًا للقاموس <code>locals</code> فستُنفّذ الشّيفرة كأنّها داخل [[Python/class_definition|تعريف صنف]]. | ||
== انظر أيضًا == | == انظر أيضًا == | ||
* [[Python/compile| | * الدالة <code>[[Python/compile|compile()]]</code>: تجمّع شيفرة بايثون مصدريّةً إلى شيفرة أو كائن AST. | ||
* [[Python/eval| | * الدالة <code>[[Python/eval|eval()]]</code>: تستخدم لتقدير قيمة تعبير من تعابير لغة بايثون. | ||
== مصادر == | == مصادر == |
المراجعة الحالية بتاريخ 16:10، 25 مايو 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("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
فستُنفّذ الشّيفرة كأنّها داخل تعريف صنف.
انظر أيضًا
- الدالة
compile()
: تجمّع شيفرة بايثون مصدريّةً إلى شيفرة أو كائن AST. - الدالة
eval()
: تستخدم لتقدير قيمة تعبير من تعابير لغة بايثون.