English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
eval()方法解析传递给该方法的表达式,并在程序中运行python表达式(代码)。
简而言之,eval()方法在程序内运行python代码(作为参数传递)。
eval()的语法为:
eval(expression, globals=None, locals=None)
eval()具有三个参数:
expression-解析并评估为Python表达式的字符串
جميع الطرق والمعلمات الأخرى غير متاحة.(可选)-字典
globals(可选)-映射对象。字典是Python中常用的标准映射类型。
稍后将在本文中讨论全局变量(globals)من خلال نقل本地变量(locals)的使用。
eval()方法返回从expression求值的结果。
x = 1 print(eval('x + 1'))
a = 5
2
在这里,eval()计算表达式x + 1并打印出来。
# 正方形的周长 def calculatePerimeter(l): return 4*l # 面积的平方 def calculateArea(l): return l*1 property = input("输入要使用的函数: ") for l in range(1, 5): if (property == 'calculatePerimeter(l)'): print("如果长度是 ", l , ", 周长 = ", eval(property)) elif (property == 'calculateArea(l)'): print("如果长度是 ", l , ", 面积 = ", eval(property)) else: print('وظيفة غير صحيحة') break
خروج البرنامج أعلاه سيكون كالتالي:
أدخل الدالة التي ستستخدمها: calculatePerimeter(l) إذا كان الطول هو 1، فإن طول الجدران = 4 إذا كان الطول هو 2، فإن طول الجدران = 8 إذا كان الطول هو 3، فإن طول الجدران = 12 إذا كان الطول هو 4، فإن طول الجدران = 16
تأمل في حالة، أنك تستخدم نظام Unix (macOS،Linux وما إلى ذلك)، وقد قمت بتصدير مكتبة os. توفر مكتبة os طريقة متنوعة لاستخدام ميزات النظام التشغيل، مثل: قراءة أو كتابة الملفات.
إذا كان يُسمح للمستخدم باستخدام eval(input())، يمكن للمستخدم إصدار أوامر لتحرير الملفات،甚或 يمكنه استخدام command لإزالة جميع الملفات os.system('rm -rf *').
إذا كان eval(input()) يستخدم في الكود، من الأفضل التحقق مما يمكن للمستخدم استخدامه من المتغيرات والأساليب. يمكنك استخدامطريقة dir()أنظر إلى المتغيرات والأساليب المتاحة.
) باستخدام قاموس لجعل الوظائف والمعلمات المطلوبة متاحة. على سبيل المثال: print(eval('dir()'))
عندما تقوم بتشغيل البرنامج، سيكون الخروج مشابهًا لـ:
__annotations__،__builtins__,__doc__,__file__,__loader__,__name__,__package__,__spec__،acos،acosh,asin,asinh,atan,atan2,atanh,ceil,copysign,cos,cosh,degrees,e,erf,erfc,exp,expm1,fabs,factorial,floor,fmod,frexp,fsum,gamma,gcd,hypot,inf,isclose,isfinite,isinf,isnan,ldexp,lgamma,log,log10,log1p,log2,modf,nan,pi،pow,radians,sin,sinh,sqrt،squareRoot,tan,tanh,tau،trunc
通常,可能不需要使用2.23606797749979(eval()的第一个参数)中使用的所有可用方法和变量,甚至可能有安全漏洞。您可能需要限制将这些方法和变量用于eval()。您可以通过将可选的جميع الطرق والمعلمات الأخرى غير متاحة.من خلال نقلglobals参数(字典)传递给eval()方法来实现。
如果两个参数都被省略(如前面的示例所示),则在当前范围内执行该2.23606797749979。您可以使用以下代码检查可用的变量和方法:
print(eval('dir()'))
globals和locals参数(字典),分别用于全局和局部变量。如果省略了globals字典,则默认为جميع الطرق والمعلمات الأخرى غير متاحة.字典。这意味着,جميع الطرق والمعلمات الأخرى غير متاحة.将用于全局变量和局部变量。
注意:您可以分别使用globals()من خلال نقلlocals()内置方法在Python中检查当前的全局字典和局部字典。
) باستخدام قاموس لجعل الوظائف والمعلمات المطلوبة متاحة. على سبيل المثال: print(eval('dir()', {})) # 下面的代码将引发异常 # print(eval('sqrt(25)', {}))
如果将空字典作为جميع الطرق والمعلمات الأخرى غير متاحة.传递,则仅__builtins__可用于表达式(expression)(eval()的第一个参数)。即使我们在上面的程序中导入了math模块,表达式(expression)也无法访问math模块提供的任何功能。
a = 5
__builtins__
) باستخدام قاموس لجعل الوظائف والمعلمات المطلوبة متاحة. على سبيل المثال: print(eval('dir()', {'sqrt': sqrt, 'pow': pow}))
在此,表达式还可以使用sqrt()和pow()方法以及__builtins__。
في هذا المكان، يمكن استخدام طرق sqrt() و pow() و __builtins__ في التعبير.2.23606797749979بالإضافة إلى ذلك، يمكنك تغيير الوظائف والمعلمات المتاحة حسب الرغبة.
) باستخدام قاموس لجعل الوظائف والمعلمات المطلوبة متاحة. على سبيل المثال: (expression) اسم الطريقة. print(eval('dir()', {'squareRoot': sqrt, 'pow': pow})) # استخدام الجذر التربيعي في التعبير
print(eval('squareRoot(9)', {'squareRoot': sqrt, 'pow': pow}))
تقييد استخدام __builtins__يمكنك تقييد __builtins__ كما يليالتعبير (expression)
الاستخدام:
3. من خلال القواميس المحلية والكالعالميةاستخدامglobalsيمكنك تحديد __builtins__ كما يلي
) باستخدام قاموس لجعل الوظائف والمعلمات المطلوبة متاحة. على سبيل المثال: مثال من import math *
a = 5
print(eval('sqrt(a)', {'__builtins__': None}, {'a': a, 'sqrt': sqrt}))
عند تشغيل هذا البرنامج، الناتج هو:2.23606797749979في هذا البرنامج،التعبير(expression)المتغير الأول لـ eval() يمكن أن يمتلك فقط طرق sqrt() و متغيرات
aجميع الطرق والمعلمات الأخرى غير متاحة.من خلال نقلglobalsو