0

我正在寻找一种装饰任意python函数的方法,以便调用替代函数而不是原始函数,所有参数作为列表或字典传递。

更准确地说,是这样的(其中 f 是任何函数,replacement_f 接受一个列表和一个字典):

def replace_func(f, replacement_f):
    def new_f(*args, **kwargs):
        replacement_f(args, kwargs)
    return new_f

但是,我不能replacement_f在里面引用new_f。而且我不能使用传递replacement_ftonew_f作为不同参数的默认值的标准技巧,因为我使用的是*args**kwargs变量参数列表。

调用原始函数的位置不能更改,并且将接受位置参数和命名参数。

我担心这不是很清楚,但如果需要,我很乐意澄清。

谢谢

4

4 回答 4

4

你为什么不试试:

f = replacement_f

示例

>>> def rep(*args):
    print(*args, sep=' -- ')

>>> def ori(*args):
    print(args)

>>> ori('dfef', 32)
('dfef', 32)
>>> ori = rep
>>> ori('dfef', 32)
dfef -- 32
于 2009-08-18T17:44:41.600 回答
1

尽管我认为 SilentGhost 的答案是对您有用的最佳解决方案,但为了完整起见,这里是您尝试做的正确版本:

要定义一个接受参数的装饰器,您必须引入一个额外的级别:

def replace_function(repl):
    def deco(f):
        def inner_f(*args, **kwargs):
            repl(*args, **kwargs)

        return inner_f
    return deco

现在您可以使用带有参数的装饰器:

@replace_function(replacement_f)
def original_function(*args, **kwargs):
    ....
于 2009-08-18T18:17:56.743 回答
0

如果我理解正确,您希望将所有参数从一个函数传递给另一个函数。

只需这样做:

def replace_func(f, replacement_f):
    def new_f(*args, **kwargs):
        replacement_f(*args, **kwargs) # args & kwargs will be expanded
    return new_f
于 2009-08-18T17:43:27.063 回答
0

这符合你的意思吗?未经测试

def replace_func(f, replacement_f):
    nonlocal replacement_f  #<<<<<<<<<<<<<<<py3k magic
    def new_f(*args, **kwargs):
        replacement_f(*args, **kwargs) # args & kwargs will be expanded
    replacement_f = new_f

Python 非本地语句

编辑:这是一个开始,我很困惑你想要什么,但我认为 nonlocal 会有所帮助

于 2009-08-18T17:48:48.427 回答