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