(免责声明:我不是Python专家,请温柔对待)
我正在尝试使用以下内容组合函数:
def compose(*functions):
return functools.reduce(lambda acc, f: lambda x: acc(f(x)), functions, lambda x: x)
这在标量函数中是可以预期的。我想要处理返回元组和接受多个参数的函数,例如。
def dummy(name):
return (name, len(name), name.upper())
def transform(name, size, upper):
return (upper, -size, name)
# What I want to achieve using composition,
# ie. f = compose(transform, dummy)
transform(*dummy('Australia'))
=> ('AUSTRALIA', -9, 'Australia')
由于dummy
返回一个元组,transform
需要三个参数,因此我需要解包该值。
如何在使用上述的compose
函数时实现这一点?如果我像这样尝试,我会得到:
f = compose(transform, dummy)
f('Australia')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in <lambda>
File "<stdin>", line 2, in <lambda>
TypeError: transform() takes exactly 3 arguments (1 given)
有没有一种方法可以更改
compose
,使其在需要时进行解包?
compose(operator.abs, operator.neg)
会出现_TypeError: abs() argument after * must be a sequence, not int_。有没有办法让compose
函数在这两种情况下都能正常工作?(这才是我最初问题的意义所在)。 - VH-NZZ