句法

eval(表达式[,globals = None [,locals = None]])

EXEC(对象)

exec(对象,全局)

exec(对象,全局,本地)

参数

争论细节expression 表达式代码为字符串或code对象

object 语句代码为字符串或code对象

globals 用于全局变量的字典。如果未指定locals,则此选项也用于本地。如果省略,则使用调用范围的globals() 。

locals 用于局部变量的映射对象。如果省略,则使用为globals传递的那个。如果两者都省略,则调用范围的globals()和locals()分别用于globals和locals globals 。

备注

在exec ,如果globals是locals (即它们引用同一个对象),代码就像在模块级别上一样执行。如果globals和locals globals是不同的对象,则代码的执行就像它在类体中一样 。

如果传入globals对象,但未指定__builtins__ key,则Python内置函数和名称将自动添加到全局范围。为了抑制执行范围中print或isinstance等函数的可用性,让globals将键__builtins__映射到值None 。但是,这不是安全功能。

不应使用Python 2特定语法; Python 3语法将在Python 2中使用。因此,不推荐使用以下表单:exec object

exec object in globals

exec object in globals, locals

用exec评估语句

>>> code = """for i in range(5):\n print('Hello world!')"""

>>> exec(code)

Hello world!

Hello world!

Hello world!

Hello world!

Hello world!

用eval评估表达式

>>> expression = '5 + 3 * a'

>>> a = 5

>>> result = eval(expression)

>>> result

20

预编译表达式以多次计算它

compile内置函数可用于将表达式预编译到代码对象;然后可以将此代码对象传递给eval。这将加速重复执行评估的代码。要compile的第3个参数需要是字符串'eval' 。>>> code = compile('a * b + c', '', 'eval')

>>> code

at 0x7f0e51a58830, file "", line 1>

>>> a, b, c = 1, 2, 3

>>> eval(code)

5

使用自定义全局变量用eval计算表达式

>>> variables = {'a': 6, 'b': 7}

>>> eval('a * b', globals=variables)

42

作为一个加号,使用此代码不能意外地引用外部定义的名称:>>> eval('variables')

{'a': 6, 'b': 7}

>>> eval('variables', globals=variables)

Traceback (most recent call last):

File "", line 1, in

File "", line 1, in

NameError: name 'variables' is not defined

使用defaultdict允许将未定义的变量设置为零:>>> from collections import defaultdict

>>> variables = defaultdict(int, {'a': 42})

>>> eval('a * c', globals=variables) # note that 'c' is not explicitly defined

0

使用ast.literal_eval评估包含Python文字的字符串

如果您有一个包含Python文字的字符串,例如字符串,浮点数等,则可以使用ast.literal_eval来评估其值而不是eval 。这具有仅允许某些语法的附加功能。>>> import ast

>>> code = """(1, 2, {'foo': 'bar'})"""

>>> object = ast.literal_eval(code)

>>> object

(1, 2, {'foo': 'bar'})

>>> type(object)

但是,这对于执行不受信任的用户提供的代码并不安全,并且通过精心设计的输入使解释器崩溃是微不足道的>>> import ast

>>> ast.literal_eval('()' * 1000000)

[5] 21358 segmentation fault (core dumped) python3

这里,输入是一个()重复一百万次的字符串,这会导致CPython解析器崩溃。 CPython开发人员不会将解析器中的错误视为安全问题。

使用exec,eval或ast.literal_eval执行不受信任的用户提供的代码

无法使用eval或exec安全地从不受信任的用户执行代码。即使ast.literal_eval也很容易在解析器中崩溃。有时可以防止恶意代码执行,但它不排除在解析器或标记器中彻底崩溃的可能性。

要评估不受信任的用户的代码,您需要转向某些第三方模块,或者用Python编写自己的解析器和自己的虚拟机。

python动态执行语句_Python Language相关推荐

  1. python do while语句_python控制语句执行流程(while)

    循环语句 Python提供了for循环和while循环(在Python中没有do..while循环) while语句 格式: while 判断条件: 执行语句.... -->判断条件可以是任何表 ...

  2. python动态执行代码_第6.6节 Python动态执行小结

    一.    Python动态执行支持通过输入数据流或文件传入Python源代码串,进行编译后执行,可以通过这种方式扩展Python程序的功能: 二.    动态执行方法可能导致恶意攻击,因此使用时需要 ...

  3. python认识if语句_python初认识、基础数据类型以及 if 流程控制

    python初认识 CPU.内存.硬盘以及操作系统之间的关系 CPU:中央处理器,计算机的逻辑运算单元 硬盘:长期存储数据的地方,断电不会丢失 内存:位于CPU与硬盘之间,缓解高速CPU与低速硬盘之间 ...

  4. python语言继承6.3节例6-1中的person_第6.3节 Python动态执行之动态编译的compile函数...

    Python支持动态代码主要三个函数,分别是compile.eval和exec.本节介绍compile函数的语法和相关使用.compile函数用来编译一段字符串的源码,将其编译为字节码或者AST(抽像 ...

  5. python动态爱心代码_python 动态绘制爱心的示例

    python 动态绘制爱心的示例 代码 import turtle turtle.bgcolor("black") turtle.pensize(2) sizeh = 1.2 de ...

  6. python循环结构语句_python控制语句---循环结构语句

    这次主要把循环结构的控制语句补上,主要包含while.for.continue.break.循环嵌套.主要写一些基本的认识以及包含的一些实例.当只有唯一路径且只跑一次的时候选择上一节中的选择结构语句就 ...

  7. python的pass语句_Python | 演示pass语句的示例

    python的pass语句 python中的pass语句 (pass statement in python) "pass" is a type of null operation ...

  8. python教程循环语句_Python教程:关于Python 循环语句

    Python 循环语句 本章节将向大家介绍Python的循环语句,程序在一般情况下是按顺序执行的. 编程语言提供了各种控制结构,允许更复杂的执行路径. 循环语句允许我们执行一个语句或语句组多次,下面是 ...

  9. python的常用语句_python常用语句

    python常用语句 一:判断语句: 所谓判断语句,就是指满足某些条件之后,才允许做的事情,而不满足条件,是不允许做的.例如在现实生活中,我们过马路时要看红绿灯,只有出现红灯的时候,我们才能过马路,否 ...

最新文章

  1. WdatePicker 日历控件的onchange事件无作用
  2. [BZOJ2730][HNOI2012]矿场搭建(求割点)
  3. AC日记——Power收集 洛谷 P3800
  4. 稀疏矩阵十字链表类java_稀疏矩阵的十字链表存储表示
  5. python注入进程_向进程中注入Python代码
  6. java字节码反编译_javap 反编译 java 字节码文件
  7. 海驾学车过程全揭秘——第九篇:科目三集训及考试
  8. 在html中不显示内容是,网页中显示的内容在源文件中找不到是什么原因_html/css_WEB-ITnose...
  9. transform再次理解
  10. Flutter基础—定位对齐之大小比例
  11. c语言求20项FBNC,大学C语言 结业作业 暗影行者
  12. 左右手桌面股票盯盘软件(DesktopStockTracking)
  13. QQ音乐api 最新版,亲测可用
  14. 含论文基于JAVA的户籍信息管理系统【数据库设计、源码、开题报告】
  15. Idea 报错: Variable used in lambda expression should be final or effectively final
  16. 罗技无线网卡linux,Linux(Ubuntu)装罗技LMS避坑指南
  17. Oracle存储过程实现X日均线计算
  18. 求部门最高工资(Mysql多表查询)
  19. python窗口界面自适应_自适应页面的实现方式
  20. 开发简单Android聊天软件(7)

热门文章

  1. POJ 1003 解题报告
  2. java https安全传输
  3. c#的winform调用外部exe作为子窗体
  4. python 解小学数学题_孩子尝试python解数学题,怎么实现呢?
  5. 字节跳动简历冷却期_【字节跳动招聘】简历这样写,才不会被秒拒
  6. 信息学奥赛一本通(2064:【例2.1】交换值)
  7. 家谱(信息学奥赛一本通-T1388)
  8. Building Roads(POJ-3625)
  9. 字串变换(洛谷-P1032)
  10. 计算并联电阻的阻值(信息学奥赛一本通-T1015)