如何使用运算符来组合函数?
How can I use an operator to compose functions?
编写一个包含两个其他函数的函数相当简单。 (为简单起见,假设它们各为一个参数。)
def compose(f, g):
fg = lambda x: f(g(x))
return fg
def add1(x):
return x + 1
def add2(x):
return x + 2
print(compose(add1, add2)(5)) # => 8
我想使用运算符进行组合,例如 (add1 . add2)(5)
。
有办法吗?
我尝试了各种装饰器公式,但我无法使它们中的任何一个起作用。
def composable(f):
"""
Nothing I tried worked. I won't clutter up the question
with my failed attempts.
"""
@composable
def add1(x):
return x + 1
首先,Python 语法中只允许一定数量的运算符符号。点“.
”不是有效的运算符。
This page (the page is actually about the Python operator
module, but the naming convention are the same to datamodel并且内容更有条理)列出了所有可用的运算符和对应的实例方法。例如,如果你想使用“@
”作为操作符,你可以这样写一个装饰器:
import functools
class Composable:
def __init__(self, func):
self.func = func
functools.update_wrapper(self, func)
def __matmul__(self, other):
return lambda *args, **kw: self.func(other.func(*args, **kw))
def __call__(self, *args, **kw):
return self.func(*args, **kw)
测试:
@Composable
def add1(x):
return x + 1
@Composable
def add2(x):
return x + 2
print((add1 @ add2)(5))
# 8
编写一个包含两个其他函数的函数相当简单。 (为简单起见,假设它们各为一个参数。)
def compose(f, g):
fg = lambda x: f(g(x))
return fg
def add1(x):
return x + 1
def add2(x):
return x + 2
print(compose(add1, add2)(5)) # => 8
我想使用运算符进行组合,例如 (add1 . add2)(5)
。
有办法吗?
我尝试了各种装饰器公式,但我无法使它们中的任何一个起作用。
def composable(f):
"""
Nothing I tried worked. I won't clutter up the question
with my failed attempts.
"""
@composable
def add1(x):
return x + 1
首先,Python 语法中只允许一定数量的运算符符号。点“.
”不是有效的运算符。
This page (the page is actually about the Python operator
module, but the naming convention are the same to datamodel并且内容更有条理)列出了所有可用的运算符和对应的实例方法。例如,如果你想使用“@
”作为操作符,你可以这样写一个装饰器:
import functools
class Composable:
def __init__(self, func):
self.func = func
functools.update_wrapper(self, func)
def __matmul__(self, other):
return lambda *args, **kw: self.func(other.func(*args, **kw))
def __call__(self, *args, **kw):
return self.func(*args, **kw)
测试:
@Composable
def add1(x):
return x + 1
@Composable
def add2(x):
return x + 2
print((add1 @ add2)(5))
# 8