【问题标题】:Generate a new function from an existing one with fewer arguments从现有的具有较少参数的函数生成一个新函数
【发布时间】:2020-01-19 17:29:01
【问题描述】:

我认为如果我可以通过替换现有函数的一个参数来生成一个新函数,它会使我的代码更简单、更易于阅读。在下面的 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】:

    您可以为此使用functools.partial

    在您的代码中,barwrapper 相同,因为这是 new_sum 返回的内容。当您使用1 作为参数调用bar 时,您实际上是在调用wrapper(1),它以TypeError: 'int' object is not callable 失败,因为1 不是可调用的,但您在第9 行调用1(5, *args, **kwargs)

    您的代码中的错误是wrapper 的签名。 new_sum 函数已经将 func 作为参数,你的 wrapper 应该包装 func 函数。相反,您也将func 作为wrapper 的参数。检查functools.partial 是如何实现的。阅读有关函数装饰器的内容。

    【讨论】:

    • 对,我错过了那个“功能”。 :) 感谢链接和解释我的实现中的错误!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-20
    相关资源
    最近更新 更多