Python 多次定义函数
我有一个动态Python服务,它将在每个记录的基础上定义函数,我遇到了一些我不太清楚的问题。假设我有一个这样设置的测试程序:Python 多次定义函数,python,Python,我有一个动态Python服务,它将在每个记录的基础上定义函数,我遇到了一些我不太清楚的问题。假设我有一个这样设置的测试程序: func_str = """ def func(): print "top" """ exec func_str func_str = """ def func(): print "bottom" """ exec func_str func() 当然,这将打印“bottom”,因为对exec func_str的第二次调用将覆盖第一次调用。我很好奇引擎盖下发
func_str = """
def func():
print "top"
"""
exec func_str
func_str = """
def func():
print "bottom"
"""
exec func_str
func()
当然,这将打印
“bottom”
,因为对exec func_str
的第二次调用将覆盖第一次调用。我很好奇引擎盖下发生了什么。是否以某种方式删除了第一个函数定义?编译函数体,然后将其分配给变量名func
下的本地名称空间
然后,当您运行第二个exec
语句时,一个新函数将以相同的名称存储,并覆盖第一个函数。您可以通过以新名称存储对它的引用来保留第一个名称:
foo = func
因此,您稍后仍可以将其称为foo
:
foo()
您也可以将其存储在字典、列表或其他对象的属性中。与此相同:
>>> a = 5
>>> print a
5
>>> a = 'hello'
>>> print a
'hello'
换句话说,它只是将一个函数分配给一个名称(在本例中为func),然后在随后的调用中,您将相同名称的func重新分配给另一个函数。Wow,这项服务听起来很可怕。您确定需要这样执行整个函数吗?如果有任何共同的功能,你应该认真考虑写一个单一的函数,它需要适当的输入或使用类和继承来完成任务,而不使用<代码> Exc> <代码>,如果最终用户可以修改任何输入,这可能是危险的。我知道这听起来很可怕,但这并不是任何被外部/其他用户访问的东西。@Valdogg21这并没有让它变得不那么可怕。