从参数较少的现有函数生成新函数

问题描述 投票:0回答:1

我认为,如果可以通过替换现有函数的一个参数来生成新函数,这将使我的代码更易于阅读。在下面的MWE中,我使用了求和函数并尝试实现与装饰器类似的方法,其中a = 5被硬编码为函数。不幸的是,我无法正确解释回溯。

def sum(a,b):
    return a+b

foo = sum
print(foo(2,3))

def new_sum(func, *args,**kwargs):
    def wrapper(func, *args,**kwargs):
        x = func(5, *args, **kwargs)
        return x
    return wrapper

bar = new_sum(func=sum)
print(bar(1))

返回:

$ python3 func_arg.py
5
Traceback (most recent call last):
  File "func_arg.py", line 14, in <module>
    print(bar(1))
  File "func_arg.py", line 9, in wrapper
    x = func(5, *args, **kwargs)
TypeError: 'int' object is not callable
python-3.x python-decorators
1个回答
1
投票

您可以为此使用functools.partial

在您的代码中,functools.partialbar相同,因为这是wrapper返回的内容。当以new_sum作为参数调用bar时,实际上是在以1失败的情况下调用wrapper(1),因为TypeError: 'int' object is not callable不是可调用的,而是在第9行中调用1

您的代码中的错误是1(5, *args, **kwargs)的签名。 wrapper函数已经以new_sum作为参数,您的func应该包装该wrapper函数。相反,您也将func作为func的参数。检查如何实现wrapper。阅读有关函数装饰器的信息。

© www.soinside.com 2019 - 2024. All rights reserved.