我想阻止已经定义的函数在全局范围内查找函数名,而是在定义函数时始终调用可用的版本。
在以下代码段(http://ideone.com/GvghAy)中,foo()
始终在全局范围内查找add()
,因此当add()
替换为sub()
时,{ {1}}会调用foo()
。另一方面,当sub()
被定义时,它会捕获对原始bar()
函数的引用,因此对add()
的调用将始终调用原始bar()
,即使add()
也是如此1}}被重新定义。
add()
是否可以创建一个函数装饰器,以使装饰函数始终捕获对定义装饰函数时可用函数的引用?
答案 0 :(得分:2)
执行此操作的唯一方法是将其作为参数传递给函数。虽然它不是那么糟糕 - 你可以把它变成一个关键字参数(在创建函数时获取默认值“冻结”):
def create_bar_function(add=add):
...
请注意 - 我认识的每个python程序员都认为这是一个严重的黑客行为。这不是你真正想做的事情。更好的方法是避免当前命名空间中的名称冲突。例如将add
导入为其他名称(或导入模块):
from operator import add as _add
# import operator as op # now use op.add ...
现在,用户可以定义新的add
并在他/她想要_add
时使用operator.add
。