Python提供了在代码中动态执行代码的功能。
一.exec/eval动态执行语句
exec、eval动态执行语句。exec主要用在计算方面(无返回结果),eval主要用在比较方面(返回结果)。
(特别注意:如果是将exec或者eval定义在对象内部,并且在exec内部定义了变量,则只能在他们内部访问变量才有效。就像是加了一个外壳。)
1.测试方法中执行exec与eval:
注:如果在exec内部定义的变量与外部变量同名,则给内部变量赋值之后,在内部将覆盖外部变量,在内部访问或者调用的也将是内部变量。exec()外部调用同名的外部变量,不影响原始外部变量的值。
内部变量进行计算与赋值操作之一:
内部变量进行计算与赋值操作之二:
2.类内部的方法外部操作exec:
注:在类内部并且在方法外部使用exec,依旧exec内部赋值的同名gInt变量不会是类中的全局变量gInt,也就是说在exec中无法给外部的变量赋值。(除非是在python shell命令行中直接调用,这个与项目中操作exec无关。)
二. compile_command/compile编译可执行语句(或文件)
1.compile编译动态执行文件(或者多语句)为代码对象
官方帮助文档原文:Compile the source into a code or AST object. Code objects can be executed by:func:exec
2.code 模块提供了一些用于模拟标准交互解释器行为的函数.
compile_command 与内建 compile 函数行为相似, 但它会通过测试来保证你传递的是一个完整的 Python 语句
compile_command 与compile都不计算结果,但是如果执行的语句错误compile会返回一个错误,而compile_command不会。
如果执行成功,他们返回的对象类型是一样的。
三. parser剖析器创建可执行代码
parser会将代码块构造成一个整体来运行,而且也是更快的。
官方帮助文档原文:
The parser module provides an interface to Python’s internal parser and byte-code compiler.
The primary purpose for this interface is to allow Python code to edit the parse tree of a Python expression and create executable code from this.
This is better than trying to parse and modify an arbitrary Python code fragment as a string because parsing is performed in a manner identical to the code forming the application.
It is also faster.