python动态执行语句_Python Language
句法
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相关推荐
- python do while语句_python控制语句执行流程(while)
循环语句 Python提供了for循环和while循环(在Python中没有do..while循环) while语句 格式: while 判断条件: 执行语句.... -->判断条件可以是任何表 ...
- python动态执行代码_第6.6节 Python动态执行小结
一. Python动态执行支持通过输入数据流或文件传入Python源代码串,进行编译后执行,可以通过这种方式扩展Python程序的功能: 二. 动态执行方法可能导致恶意攻击,因此使用时需要 ...
- python认识if语句_python初认识、基础数据类型以及 if 流程控制
python初认识 CPU.内存.硬盘以及操作系统之间的关系 CPU:中央处理器,计算机的逻辑运算单元 硬盘:长期存储数据的地方,断电不会丢失 内存:位于CPU与硬盘之间,缓解高速CPU与低速硬盘之间 ...
- python语言继承6.3节例6-1中的person_第6.3节 Python动态执行之动态编译的compile函数...
Python支持动态代码主要三个函数,分别是compile.eval和exec.本节介绍compile函数的语法和相关使用.compile函数用来编译一段字符串的源码,将其编译为字节码或者AST(抽像 ...
- python动态爱心代码_python 动态绘制爱心的示例
python 动态绘制爱心的示例 代码 import turtle turtle.bgcolor("black") turtle.pensize(2) sizeh = 1.2 de ...
- python循环结构语句_python控制语句---循环结构语句
这次主要把循环结构的控制语句补上,主要包含while.for.continue.break.循环嵌套.主要写一些基本的认识以及包含的一些实例.当只有唯一路径且只跑一次的时候选择上一节中的选择结构语句就 ...
- python的pass语句_Python | 演示pass语句的示例
python的pass语句 python中的pass语句 (pass statement in python) "pass" is a type of null operation ...
- python教程循环语句_Python教程:关于Python 循环语句
Python 循环语句 本章节将向大家介绍Python的循环语句,程序在一般情况下是按顺序执行的. 编程语言提供了各种控制结构,允许更复杂的执行路径. 循环语句允许我们执行一个语句或语句组多次,下面是 ...
- python的常用语句_python常用语句
python常用语句 一:判断语句: 所谓判断语句,就是指满足某些条件之后,才允许做的事情,而不满足条件,是不允许做的.例如在现实生活中,我们过马路时要看红绿灯,只有出现红灯的时候,我们才能过马路,否 ...
最新文章
- WdatePicker 日历控件的onchange事件无作用
- [BZOJ2730][HNOI2012]矿场搭建(求割点)
- AC日记——Power收集 洛谷 P3800
- 稀疏矩阵十字链表类java_稀疏矩阵的十字链表存储表示
- python注入进程_向进程中注入Python代码
- java字节码反编译_javap 反编译 java 字节码文件
- 海驾学车过程全揭秘——第九篇:科目三集训及考试
- 在html中不显示内容是,网页中显示的内容在源文件中找不到是什么原因_html/css_WEB-ITnose...
- transform再次理解
- Flutter基础—定位对齐之大小比例
- c语言求20项FBNC,大学C语言 结业作业 暗影行者
- 左右手桌面股票盯盘软件(DesktopStockTracking)
- QQ音乐api 最新版,亲测可用
- 含论文基于JAVA的户籍信息管理系统【数据库设计、源码、开题报告】
- Idea 报错: Variable used in lambda expression should be final or effectively final
- 罗技无线网卡linux,Linux(Ubuntu)装罗技LMS避坑指南
- Oracle存储过程实现X日均线计算
- 求部门最高工资(Mysql多表查询)
- python窗口界面自适应_自适应页面的实现方式
- 开发简单Android聊天软件(7)