Python:定义自己的运算符?

时间:2009-05-31 16:01:40

标签: python operators

我想定义自己的运算符。 python是否支持这样的事情?

6 个答案:

答案 0 :(得分:155)

虽然从技术上讲你无法在Python中定义新的运算符,但这个clever hack可以解决这个限制。它允许您定义这样的中缀运算符:

# simple multiplication
x=Infix(lambda x,y: x*y)
print 2 |x| 4
# => 8

# class checking
isa=Infix(lambda x,y: x.__class__==y.__class__)
print [1,2,3] |isa| []
print [1,2,3] <<isa>> []
# => True

答案 1 :(得分:39)

不,Python附带了预定义但可覆盖的set of operators

答案 2 :(得分:30)

不,您无法创建新的运营商。但是,如果您只是在评估表达式,则可以自己处理字符串并计算新运算符的结果。

答案 3 :(得分:8)

如果您打算对特定类别的对象应用该操作,您可以覆盖与您的函数最匹配的运算符...例如,覆盖__eq__()将覆盖==运算符回报你想要的任何东西。这几乎适用于所有运营商。

答案 4 :(得分:7)

Sage提供此功能,主要使用@Ayman Hourieh描述的“聪明黑客”,但作为装饰器整合到一个模块中,以提供更清晰的外观和附加功能 - 您可以选择操作员重载,因此顺序评价。

from sage.misc.decorators import infix_operator

@infix_operator('multiply')
def dot(a,b):
    return a.dot_product(b)
u=vector([1,2,3])
v=vector([5,4,3])
print(u *dot* v)
# => 22

@infix_operator('or')
def plus(x,y):
    return x*y
print(2 |plus| 4)
# => 6

有关详细信息,请参阅the Sage documentationthis enhancement tracking ticket

答案 5 :(得分:7)

Python 3.5为额外的运算符引入了符号@

PEP465引入了这个用于矩阵乘法的新算子,以简化许多数字代码的表示法。操作符不会针对所有类型实现,而只适用于类似数组的对象。

您可以通过实施__matmul__()来支持您的类/对象的运算符。

PEP为非类似数组的对象留出了不同用户的空间。

当然,对于类似数组的对象,你可以用@实现与矩阵乘法不同的任何操作,但是用户体验会受到影响,因为每个人都希望你的数据类型以不同的方式运行