我有一个动态的Python服务,它将在每个记录的基础上定义函数,我遇到了一些我无法弄清楚的东西.假设我有一个如此设置的测试程序:
func_str = """
def func():
print "top"
"""
exec func_str
func_str = """
def func():
print "bottom"
"""
exec func_str
func()
Run Code Online (Sandbox Code Playgroud)
当然,这将打印"bottom",作为第二次exec func_str覆盖第一次调用.我好奇发生了什么事.是否以某种方式删除了第一个函数定义?
编译函数体,然后将其分配给变量名下的本地命名空间func.
然后,当您运行第二个exec语句时,新函数将以相同的名称存储,覆盖第一个.您可以通过以新名称存储对它的引用来保留第一个:
foo = func
Run Code Online (Sandbox Code Playgroud)
所以你以后可以将它称为foo:
foo()
Run Code Online (Sandbox Code Playgroud)
您还可以将其存储在字典,列表或另一个对象的属性中.