اذهب إلى المحتوى
  • 0

ما الفرق بين eval وexec في بايثون؟

TheProgrammer

السؤال

أُريد معرفة الفرق بين eval و exec، فهل هنالك شخص يمكنه مساعدتي لمعرفة الفرق بينهم، فأنا أحتاج إلى معادل ديناميكي لشيفرات برمجية للبايثون.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

إن exec كانت تعليمة برمجية في الإصدار الثاني من البايثون وأصبحت دالة في الإصدار الثالث منه، وهي تجمع (compiles) بشكل فوري المعادل للتعليمة برمجية أو مجموعة من التعليمات الموجودة في سلسلة نصية معينة، مثال لاستخدام exec:

exec('print(5)')           # prints 5.
# exec 'print 5'     if you use Python 2.x, nor the exec neither the print is a function there
exec('print(5)\nprint(6)')  # prints 5{newline}6.
exec('if True: print(6)')  # prints 6.
exec('5')                 # does nothing and returns nothing.

أما بالنسبة إلى eval فهي دالة مدمجة (وليست تعليمة برمجية)، وتقوم بمعادلة التعبير ومن ثم ستُرجع القيمة التي قام ذلك التعبير بإنتاجها كما يظهر في المثال التالي:

x = eval('5')              # x <- 5
x = eval('%d + 6' % x)     # x <- 11
x = eval('abs(%d)' % -100) # x <- 100
x = eval('x = 5')          # INVALID; assignment is not an expression.
x = eval('if 1: x = 4')    # INVALID; if is a statement, not an expression.


المصدر

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

- تُستعمَل الدّالة exec()‎ لتنفيذ شيفرة بايثون ديناميكيًّا (وهذا هو الفرق الجوهري). بينما تُستخدم الدّالة eval()‎ لتقدير (evaluate) قيمة تعبير في بايثون. يتم تقدير التعبير المُعطى باستخدام معامل الكائنات العامّة globals والكائنات المحليّة locals.
- الشكل العام للدالة exec:

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

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

- الشكل العام للدالة eval:

eval(expression, globals=None, locals=None)

نفس المعاملات في الدالة السابقة، لكن هنا expression في السلسلة نصيّة التي تمثل تعبير بايثون المُراد تقديره.

 

- القيمة المعادة للدالة exec هي القيمة None مع تنفيذ الشّيفرة المُعطاة. إن لم تُمرر قيمة لكل من المُعامل globals والمعامل locals فستُنفَذ الشيفرة في البيئة التي استُدعيت فيها الدالة. وتطلق استثناءات إن كانت هناك أخطاء في بنية الشّيفرة.
- القيمة المعادة للدالة eval هي نتيجة تقدير التعبير المُعطى. إن لم تمرر قيمة لكل من المعامل globals والمعامل locals فسيُنفّذ التعبير في البيئة التي استُدعيَت فيها الدالة. وتُطلق استثناءات إن كانت هناك أخطاء في بنية التعبير.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...