exec()内置方法
一、介绍
exec()能够动态地执行复杂的Python代码,exec()仅支持string和code object参数。
官方文档:https://docs.python.org/3/library/functions.html#exec
二、示例
a = 1
b = 2
exec('c = a + b')
print(c)
# result
3
exec("""
def fact(n):
print(n)""")
fact(1)
# result
1
三、应用场景
在实际项目中,可能会将python代码写在txt文件中,而非py文件中。python代码写在txt中,不能直接使用,通过exec()来调用
python_code.txt
def fact(n):
if n==1:
return 1
else:
return n*15
t = fact(6)
print(t)
python代码写在txt中,不能直接使用,通过exec()来调用。一定要先读取文件内容,然后执行,exec只支持str
或code object
对象
with open('python_code.txt', 'r') as f:
codes = f.read()
exec(codes)
# result
90
四、传参
exec(expression, globals=None, locals=None)
-
globals 用于指定运行时的全局命名空间,类型是字典,缺省时使用的是当前模块的内置命名空间。
-
locals 指定运行时的局部命名空间,类型是字典,缺省时使用 globals 的值。
-
两者都缺省时,则遵循 exec 函数执行时的作用域。
-
值得注意的是,这两者不代表真正的命名空间,只在运算时起作用,运算后则销毁。
x = 10
expr = """
z = 30
sum = x + y + z
print(sum)
"""
def func():
y = 20
exec(expr)
exec(expr, {'x': 1, 'y': 2})
exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
func()
# result
60
33
34
# 优先使用局部变量,然后在使用全局变量,存在覆盖赋值
exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
# 等价于
# 全局变量
x = 10
y = 20
# 参数局部变量,参数的值在python字符之前
x = 1
y = 2
y = 3
z = 4
# 局部变量
z = 30
sum = x + y + z