如何使函数调用服从Python中的词法范围?

时间:2015-01-22 01:30:54

标签: python

我想阻止已经定义的函数在全局范围内查找函数名,而是在定义函数时始终调用可用的版本。

在以下代码段(http://ideone.com/GvghAy)中,foo()始终在全局范围内查找add(),因此当add()替换为sub()时,{ {1}}会调用foo()。另一方面,当sub()被定义时,它会捕获对原始bar()函数的引用,因此对add()的调用将始终调用原始bar(),即使add()也是如此1}}被重新定义。

add()

是否可以创建一个函数装饰器,以使装饰函数始终捕获对定义装饰函数时可用函数的引用?

1 个答案:

答案 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