Python 3.x 如何使用运算符在Python中组合函数?
编写一个由另外两个函数组成的函数相当简单。(为简单起见,假设每个参数都是一个参数。) 我想使用操作符进行合成,例如,Python 3.x 如何使用运算符在Python中组合函数?,python-3.x,python-decorators,function-composition,Python 3.x,Python Decorators,Function Composition,编写一个由另外两个函数组成的函数相当简单。(为简单起见,假设每个参数都是一个参数。) 我想使用操作符进行合成,例如,(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):
(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语法中只允许使用一定数量的运算符符号。点“
”不是有效的运算符
(该页面实际上是关于Python操作符
模块的,但是命名约定与相同,并且内容更加有序)列出了所有可用的操作符和相应的实例方法。例如,如果要使用“@
”作为运算符,可以编写如下装饰器:
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
你的意思是你想用中缀运算符代替标准的前缀调用符号?相关的可能重复,可能重复:谢谢。我的困惑——至少是其中之一——是dot被视为操作符,而getattribute是相关函数。此外,我还尝试使用decorator函数,而不是decorator类。我将暂时不检查您的解决方案作为答案,看看是否有其他建议。@russabbot我明白您的意思。我认为如果不直接传递另一个函数,就不能重新加载
\uuu getattribute\uu
方法来访问另一个函数。确实,您可以通过globals()
访问全局函数,但不建议这样做,而且您根本无法处理匿名函数。我遇到的问题之一是getattribute似乎将其参数作为字符串获取,即使在我向其传递函数时也是如此。我不知道如何解决这个问题。我刚刚尝试了你的解决方案的装饰函数版本。当它进入打印((add1@add2)(5))
时,我收到一条错误消息:不支持@:“function”和“function”的操作数类型
。你的方法如何避免遇到这个问题?如果我用*
替换@
,用\uuuuuMul\uMul\uUuMu
替换
,或者使用
和。\uUgt\uUu
替换(即使PyCharm抱怨布尔值不可调用,它也能成功运行),但正如我前面所说的,使用
和\uuuuuu getattribute\uuuuu
失败,因为\uuuu getattribute\uuuuuu
的参数在传递到\uuuu getattribute\uuuuu
之前已转换为字符串。
@Composable
def add1(x):
return x + 1
@Composable
def add2(x):
return x + 2
print((add1 @ add2)(5))
# 8