代码执行与调试
内置函数
breakpoint函数
函数签名:breakpoint(*args, **kws)
参数说明:
args
:要传递给断点的参数kws
:要传递给断点的关键字参数
返回值:
- 无返回值
compile函数
compile()
函数将 Python 源代码编译为代码对象,可被 eval()
或 exec()
执行。预编译可提高重复执行效率。
函数签名:compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1) -> code object
参数说明:
-
source
(必需): -
要编译的 Python 源代码
-
可以是字符串、字节串或 AST 对象
-
示例:
"x = 1 + 2"
、"print('hello')"
-
filename
(必需): -
字符串,指定代码来源文件名(用于错误提示)
-
约定:
'<string>'
(字符串)、'<stdin>'
(标准输入)、'script.py'
(实际文件) -
mode
(必需): 编译模式,决定代码类型和执行方式: -
'eval'
:单个表达式,配合eval()
使用、 -
'single'
:单个交互式语句,自动打印非None结果,配合eval()
。 -
'exec'
:任意代码块,配合exec()
使用 -
flags
(可选,默认 0): -
控制编译行为的标志位,可使用
__future__
模块常量 -
dont_inherit
(可选,默认 False): -
False
:继承当前模块的__future__
特性 -
True
:不继承,仅使用flags
指定的特性 -
optimize
(可选,默认 -1): -
优化级别:
-1
(默认)、0
(不优化)、1
(移除assert)、2
(移除assert和文档字符串) 返回值: -
返回代码对象,可传递给
eval()
或exec()
执行
# eval模式 - 编译表达式
code = compile("1 + 2 * 3", '<string>', 'eval')
result = eval(code) # 7
# exec模式 - 编译代码块
code = compile("x = 10\nprint(x)", '<string>', 'exec')
exec(code) # 打印 10
# single模式 - 交互式(自动打印非None结果)
code = compile("42", '<string>', 'single')
eval(code) # 自动打印 42
exec(code) # 自动打印 42
# 预编译提高性能
code = compile("x ** 2", '<string>', 'eval')
for x in range(5):
print(eval(code)) # 比每次编译字符串更快
eval函数和exec函数
eval函数签名:eval(expression, globals=None, locals=None) -> value
exec函数签名:exec(object, globals=None, locals=None) -> value
参数说明:
expression
/object
:要执行的表达式或代码对象expression
:只能是单个表达式,一个字符串形式的 Python 表达式,或一个代码对象(由 compile() 编 译得到)object
:可以包含任意 Python 代码:赋值、循环、函数定义、类定义等。可以是一个字符串,也可以是一个代码对象,也可以是打开的文件对象。
globals
:全局命名空间- 一个字典,指定代码执行时的全局命名空间
- 默认为 None,使用当前全局命名空间
- 如果提供且不包含 builtins 键,会自动添加对内置模块的引用
- 必须是字典类型,不能是其他映射对象
- 在此字典中定义的变量可被执行的代码访问和修改
locals
:局部命名空间- 一个映射对象,指定代码执行时的局部命名空间
- 默认为 None,此时使用 globals 作为局部命名空间
- 可以是任何映射类型
- 注意:对 locals 的修改可能不会影响到外部局部变量(取决于实现)
返回值:
- eval 返回表达式的值
- exec 返回 None
code = compile("print('Hello, World!')", 'test.py', 'exec')
return_value = exec(code) # 执行编译后的代码、代码块,返回None
print(return_value) # None
return_value = eval("1 + 1") # 执行表达式,返回表达式的值
print(return_value) # 2