多次定义函数

Val*_*g21 0 python

我有一个动态的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覆盖第一次调用.我好奇发生了什么事.是否以某种方式删除了第一个函数定义?

Mar*_*ers 5

编译函数体,然后将其分配给变量名下的本地命名空间func.

然后,当您运行第二个exec语句时,新函数将以相同的名称存储,覆​​盖第一个.您可以通过以新名称存储对它的引用来保留第一个:

foo = func
Run Code Online (Sandbox Code Playgroud)

所以你以后可以将它称为foo:

foo()
Run Code Online (Sandbox Code Playgroud)

您还可以将其存储在字典,列表或另一个对象的属性中.