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

Python 基础教程

Python 流程控制

الوظائف في Python

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

Python 文件操作

Python 对象和类

Python 日期和时间

Python 高级知识

Python 参考手册

Python eval() 使用方法及示例

وظائف مدمجة Python

eval()方法解析传递给该方法的表达式,并在程序中运行python表达式(代码)。

简而言之,eval()方法在程序内运行python代码(作为参数传递)。

eval()的语法为:

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

eval()参数

eval()具有三个参数:

  • expression-解析并评估为Python表达式的字符串

  • جميع الطرق والمعلمات الأخرى غير متاحة.(可选)-字典

  • globals(可选)-映射对象。字典是Python中常用的标准映射类型。

稍后将在本文中讨论全局变量(globals)من خلال نقل本地变量(locals)的使用。

eval()返回值

eval()方法返回从expression求值的结果。

示例1:eval()如何在Python中工作?

x = 1
print(eval('x + 1'))

a = 5

2

在这里,eval()计算表达式x + 1并打印出来。

示例2:演示使用eval()的实际示例

# 正方形的周长
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

لماذا يجب أن تكون حذرًا عند استخدام eval()؟

تأمل في حالة، أنك تستخدم نظام 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

限制在eval()中使用可用的方法和变量

通常,可能不需要使用2.23606797749979(eval()的第一个参数)中使用的所有可用方法和变量,甚至可能有安全漏洞。您可能需要限制将这些方法和变量用于eval()。您可以通过将可选的جميع الطرق والمعلمات الأخرى غير متاحة.من خلال نقلglobals参数(字典)传递给eval()方法来实现。

1.当省略globals和locals参数时

如果两个参数都被省略(如前面的示例所示),则在当前范围内执行该2.23606797749979。您可以使用以下代码检查可用的变量和方法:

print(eval('dir()'))

2.传递全局参数;省略locals参数

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}))

في البرنامج المذكور أعلاه، حساب squareRoot() يحسب الجذر التربيعي (مثل وظائف مشابهة مثل sqrt()). ولكن، سيؤدي استخدام sqrt() إلى خطأ.

تقييد استخدام __builtins__يمكنك تقييد __builtins__ كما يليالتعبير (expression)

الاستخدام:

eval(expression, {'__builtins__': None})

3. من خلال القواميس المحلية والكالعالميةاستخدامglobalsيمكنك تحديد __builtins__ كما يلي

) باستخدام قاموس لجعل الوظائف والمعلمات المطلوبة متاحة. على سبيل المثال:
مثال
من import math *

a = 5

 print(eval('sqrt(a)', {'__builtins__': None}, {'a': a, 'sqrt': sqrt}))

عند تشغيل هذا البرنامج، الناتج هو:2.23606797749979في هذا البرنامج،التعبير(expression)المتغير الأول لـ eval() يمكن أن يمتلك فقط طرق sqrt() و متغيرات

aجميع الطرق والمعلمات الأخرى غير متاحة.من خلال نقلglobalsو

وظائف مدمجة Python