Python使用eval函数执行动态标表达式过程详解

 更新时间:2020年10月17日 10:39:37   作者:lincappu  
这篇文章主要介绍了Python使用eval函数执行动态标表达式过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

英文文档:

eval(expression, globals=None, locals=None)
The arguments are a string and optional globals and locals. If provided, globals must be a dictionary. If provided, localscan be any mapping object.

The expression argument is parsed and evaluated as a Python expression (technically speaking, a condition list) using the globals and locals dictionaries as global and local namespace. If the globals dictionary is present and lacks ‘__builtins__', the current globals are copied into globals before expression is parsed. This means that expressionnormally has full access to the standard builtins module and restricted environments are propagated. If the localsdictionary is omitted it defaults to the globals dictionary. If both dictionaries are omitted, the expression is executed in the environment where eval() is called. The return value is the result of the evaluated expression. Syntax errors are reported as exceptions. Example:

>>> x = 1
>>> eval('x+1')
2

This function can also be used to execute arbitrary code objects (such as those created by compile()). In this case pass a code object instead of a string. If the code object has been compiled with 'exec' as the mode argument, eval()‘s return value will be None.

Hints: dynamic execution of statements is supported by the exec() function. The globals() and locals() functions returns the current global and local dictionary, respectively, which may be useful to pass around for use by eval() or exec().
See ast.literal_eval() for a function that can safely evaluate strings with expressions containing only literals.

  执行动态标表达式求值

说明:  

  1. 执行动态语句,返回语句执行的值。

>>> eval('1+2+3+4')
10

  2. 第一个参数为语句字符串,globals参数和locals参数为可选参数,如果提供,globals参数必需是字典,locals参数为mapping对象。

  3. globals参数用来指定代码执行时可以使用的全局变量以及收集代码执行后的全局变量。

>>> g = {'num':2}

>>> eval('num + 2') #num未定义
Traceback (most recent call last):
 File "<pyshell#3>", line 1, in <module>
  eval('num + 2')
 File "<string>", line 1, in <module>
NameError: name 'num' is not defined

>>> eval('num + 2',g) #g中有定义num,可执行
4

  4. locals参数用来指定代码执行时可以使用的局部变量以及收集代码执行后的局部变量

>>> g = {'num1':2}
>>> l = {'num2':4}
>>> eval('num1+num2',g,l)
6

  5. 为了保证代码成功运行,globals参数字典不包含 __builtins__ 这个 key 时,Python会自动添加一个key为 __builtins__ ,value为builtins模块的引用。如果确实要限制代码不使用builtins模块,需要在global添加一个key为__builtins__,value为{}的项即可(很少有人这么干吧)。

>>> g = {}
>>> eval('abs(-1)',g)
1
>>> g = {'__builtins__':{}}
>>> eval('abs(-1)',g) #不能使用内置函数了
Traceback (most recent call last):
 File "<pyshell#9>", line 1, in <module>
  eval('abs(-1)',g)
 File "<string>", line 1, in <module>
NameError: name 'abs' is not defined

  6. 当globals参数不提供是,Python默认使用globals()函数返回的字典去调用。当locals参数不提供时,默认使用globals参数去调用。

>>> num = 1
>>> eval('num+2')
3

>>> globals() #返回字典中含有num的key
{'__doc__': None, 'num': 1, '__package__': None, '__name__': '__main__', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__builtins__': <module 'builtins' (built-in)>}

>>> eval('num+2',{}) #locals参数未提供,locals参数=globals参数
Traceback (most recent call last):
 File "<pyshell#3>", line 1, in <module>
  eval('num+2',{})
 File "<string>", line 1, in <module>
NameError: name 'num' is not defined

>>> l = locals() 
>>> eval('num+2',{},l) #locals参数含有num的key,能求值
3

>>> locals()
{'__doc__': None, 'l': {...}, 'num': 1, '__package__': None, '__name__': '__main__', '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__builtins__': <module 'builtins' (built-in)>}
>>>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Python使用pickle模块存储数据报错解决示例代码

    Python使用pickle模块存储数据报错解决示例代码

    这篇文章主要介绍了Python使用pickle模块存储数据报错解决示例代码,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • OpenCV简单标准数字识别的完整实例

    OpenCV简单标准数字识别的完整实例

    这篇文章主要给大家介绍了关于OpenCV简单标准数字识别的相关资料,要通过opencv 进行数字识别离不开训练库的支持,需要对目标图片进行大量的训练,才能做到精准的识别出目标数字,需要的朋友可以参考下
    2021-09-09
  • python求最大公约数和最小公倍数的简单方法

    python求最大公约数和最小公倍数的简单方法

    在本篇文章里小编给大家整理的是关于python求最大公约数和最小公倍数的简单方法,需要的朋友们学习下。
    2020-02-02
  • 让Python代码运行更快的9个小技巧

    让Python代码运行更快的9个小技巧

    我们经常听到 “Python 太慢了”,“Python 性能不行”这样的观点,但是,只要掌握一些编程技巧,就能大幅提升 Python 的运行速度,今天就让我们一起来看下让 Python 性能更高的 9 个小技巧,需要的朋友可以参考下
    2024-01-01
  • Python给文件夹加解密的实现

    Python给文件夹加解密的实现

    数据泄露已经成为一个严重的问题,为了保护用户和公司的隐私,给文件夹加密已经成为一个必要的步骤,本文主要介绍了Python给文件夹加解密的实现,感兴趣的可以了解一下
    2023-11-11
  • python中with语句结合上下文管理器操作详解

    python中with语句结合上下文管理器操作详解

    这篇文章主要给大家介绍了关于python中with语句结合上下文管理器操作的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-12-12
  • python使用reportlab画图示例(含中文汉字)

    python使用reportlab画图示例(含中文汉字)

    这篇文章主要介绍了python使用reportlab画图示例,大家参考使用吧
    2013-12-12
  • Python中的线程同步的常用方法总结

    Python中的线程同步的常用方法总结

    在Python多线程编程中,我们常常需要处理多个线程同时访问共享数据的情况,为了防止数据在多线程之间出现冲突,我们需要对线程进行同步。本文将详细介绍Python中的线程同步的几种常用方法,需要的朋友可以参考下
    2023-06-06
  • Python SMTP配置参数并发送邮件

    Python SMTP配置参数并发送邮件

    这篇文章主要介绍了Python SMTP配置参数并发送邮件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 使用python批量修改XML文件中图像的depth值

    使用python批量修改XML文件中图像的depth值

    这篇文章主要介绍了使用python批量修改XML文件中图像的depth值,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07

最新评论