English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دروس بايثون الأساسية

تحكم في عملية بايثون

الوظائف في Python

أنواع البيانات في Python

عمليات ملف بايثون

كائنات وشرائح بايثون

تواريخ ووقت بايثون

معرفة متقدمة بايثون

دليل بايثون

استخدامات exec() في بايثون واستمارات مثال

Python 内置函数

ي�行 طريقة exec() برامج يتم إنشاؤها ديناميكياً، ويمكن أن تكون سلسلة أو كائن برمجي.

نصوص syntax لـ exec()

exec(object, globals, locals)

معلمات exec()

يأخذ exec() ثلاثة معلمات:

  • كائن - سلسلة أو كائن البرنامج

  • globals ـ(اختياري) - الدليل

  • localsـ(اختياري) - كائن الت映射. الدليل هو نوع الت映射 القياسي المستخدم في بايثون.

سيتم مناقشتها لاحقاً في هذا المقالالمتغيرات العالمية(globals) و (locals)محليالمتغيرالاستخدام.

قيمة إرجاع exec()

لا يعود exec() بأي قيمة، بل يعود بلا شيء (None).

مثال 1: كيف يعمل exec()؟

برنامج = 'a = 5\nb=10\nإدراج("المجموع =", a+b)'
exec(program)

运行该程序时,输出为:

المجموع = 15

في هذا السياق، يتم تمرير كائن السلسلة البرنامج إلى exec() الذي ي�行 البرنامج. في هذا المثال، تم إغفال المتغيرات العالمية (globals) والمحلية (locals)المتغيرات المحلية.

مثال 2: السماح للمستخدم بإدخال

برنامج = إدخال('إدخال البرنامج:')
exec(program)

运行该程序时,输出为:

输入程序: [print(item) for item in [1, 2, 3]]
1
2
3

如果要从允许多行代码的用户处获取Python代码(使用'\n'),则可以在使用exec()之前使用compile()方法。

了解有关Python中的compile()方法更多信息。

使用exec()时要小心

考虑一种情况,您正在使用Unix系统(macOS,Linux等),并且已导入os模块。os模块提供了使用操作系统功能的便携式方法,例如:读取或写入文件。

如果允许用户使用来输入值exec(input()),则用户可以发出命令来更改文件,甚至可以使用command删除所有文件os.system('rm -rf *')。

如果exec(input())在代码中使用,最好检查用户可以使用哪些变量和方法。您可以使用dir()方法查看可用的变量和方法。

from math import *
exec('print(dir())')

运行该程序时,输出为:

['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__name__', '_dh', '_i', '_i1', '_i2', '_ih', '_ii', '_iii', '_oh', '_sh', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exit', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'get_ipython', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'quit', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']

تقييد استخدام الطرق والمتغيرات المتاحة في exec()

عادةً، لا تحتاج إلى استخدام جميع الطرق والمتغيرات المتاحة في exec()، وقد تكون هناك ثغرات أمنية. يمكنك تقييد استخدام الطرق والمتغيرات المتاحة في exec() عن طريق تمريرglobalslocalsتم تمرير المعاملات (قاموس) إلى دالة exec() لتقييد استخدام هذه المتغيرات والطرق.

1. تم تمرير المعاملات العالمية المحلية (globals) و (locals) كلاهما

إذا تم تمرير كلا المعاملين (كما في مثالنا السابق)، فإن exec() يتوقع تنفيذ الكود في النطاق الحالي. يمكنك استخدام الكود التالي لفحص المتغيرات والطرق المتاحة:

exec('print(dir())')

تم تمرير المعاملات العالمية؛ تمرير المعاملات المحلية

(globals) و (locals)المعاملالقاموس (، للاعتبارات العالمية والمحلية). إذا تم تمريرlocalsالقاموس، إذا لم يتم تقديم القاموس، فإن القيمة الافتراضية هيglobalsالمعنى هو أنالغيرية (globals)globals)ستستخدم للاعتبارات العالمية والمحلية.

ملاحظة:يمكنك استخدامها على التواليglobals()locals()تقوم الطرق المدمجة في Python بفحص القاموس العالمي والقاموس المحلي الحالي.

تم تمرير قاموس فارغ كمعاملات عالمية

from math import *
# exec('print(dir())', {})
# هذا الكود سيؤدي إلى استثنائية
# exec('print(sqrt(9))', {})

إذا تم تقديم قاموس فارغ كglobalsإذا تم تمريرها، يمكن استخدام فقط __builtins__ من قبل الكائن (المستلم الأول لـ exec()) حتى لو قمنا بجلب مكتبة math في البرنامج السابق، وحاولنا الوصول إلىمكتبة mathستؤدي أي دالة تقدمها إلى إطلاق استثناء.

运行该程序时,输出为:

__builtins__

جعل بعض الطرق متاحة

from math import *
exec('print(dir())', {'sqrt': sqrt, 'pow': pow})
# يمكن أن يكون المثال المطلوب sqrt() كجزء من الكائن
exec('print(sqrt(9))', {'sqrt': sqrt, 'pow': pow})

في هذا السياق، يمكن أن يكون الكود الذي يتم تنفيذه بواسطة exec() يحتوي أيضًا على طرق sqrt() وpow() و __builtins__.

يمكنك تغيير اسم الطريقة حسب رغبتك.

from math import *
exec('print(dir())', {'squareRoot': sqrt, 'pow': pow})
# 对象可以具有squareRoot()模块
exec('print(squareRoot(9))', {'squareRoot': sqrt, 'pow': pow})

在上述程序中,squareRoot()计算平方根(类似的功能,如sqrt())。但是,尝试使用sqrt()将引发异常。

限制使用内置

您可以通过在globals字典中为__builtins__赋值None,来限制__builtins__的使用。

exec(object, {'__builtins__': None})

3.通过全局和本地字典

您可以通过传递本地(locals)字典来使所需的函数和变量可用。例如:

from math import *
globalsParameter = {'__builtins__' : None}
localsParameter = {'print': print, 'dir': dir}
exec('print(dir())', globalsParameter, localsParameter)

运行该程序时,输出为:

['dir', 'print']

在这里,exec()方法只能执行两个内置方法print()dir()

需要特别注意的是,exec()执行代码,并且不返回任何值(返回None)。因此,您不能在函数定义之外使用return和yield语句。

Python 内置函数