【问题标题】:How to return new function with the arguments backwards如何使用向后的参数返回新函数
【发布时间】:2019-03-02 15:07:05
【问题描述】:

我想用 Python 写一个函数。给定一个函数,返回一个新函数,该函数向后运行带有参数的原始函数。 例如输入函数funcpow,所以func(2, 3) = 8。返回的新函数会做pow(3,2) = 9。

我在另一个post找到了这个解决方案

def flip(func):
        'Create a new function from the original with the arguments reversed'
        @wraps(func)
        def newfunc(*args):
            return func(*args[::-1])
        return newfunc

没有@wrap,有没有办法做到这一点?参数的数量是未知的。它可以是任何类型:intstring。所以我想要的函数只需要一个参数,即原始函数的名称。

reverse_args(f)

调用时,*args 将跟随:

reverse_args(func)(*args)

【问题讨论】:

  • 是的……别说了……
  • 无论如何我都不会使用@wraps。它将从原始文档中复制文档字符串,这在反转参数后可能不正确。

标签: python function decorator args


【解决方案1】:

如果这是您唯一的疑问:不需要 @wraps 装饰器。 它所做的是将一些元数据添加到它标记的包装函数中,以使其更类似于它包装的原始函数。一方面,它会覆盖包装器(在本例中为 newfunc__name__ 属性,使其在打印或看到其 repr 时与原始属性相同。

反转参数序列的是args[::-1] 部分和* 运算符,它将参数分配回去。

【讨论】:

  • @wraps 还提供了包装函数的文档。但是,如果交换参数的顺序,则文档可能不正确。
  • 是的——当我写“一些元数据”时,文档被解决了,因为还有更多的属性被复制过来。文档有点扭曲,因为必须检查 functools.update_wrapper 的默认值才能准确了解 wraps 的作用。
【解决方案2】:

lambda ?

def f(a,b):
    return a**b

def transform(f):
    return lambda *args : f(*args[::-1])

g=transform(f)

print(g(4,5))

打印625

【讨论】:

  • 好的,但是使用 lambda 而不是“普通”函数没有任何好处。它只是隐藏了函数名。
  • 看来OP只想删除@wraps(func)。你的代码做了那个和其他的事情。我必须说我不完全明白为什么发布这个问题。
  • 我想 OP 不喜欢装饰器。好吧,很高兴它有帮助。至少它不是“为什么1 is True 是虚假或无用之类的东西”的万亿次重复
猜你喜欢
  • 2021-02-13
  • 1970-01-01
  • 2010-11-03
  • 2021-05-29
  • 2021-11-22
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
相关资源
最近更新 更多