我想定义自己的运算符。 python是否支持这样的事情?
答案 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 documentation和this enhancement tracking ticket。
答案 5 :(得分:7)
Python 3.5为额外的运算符引入了符号@
。
PEP465引入了这个用于矩阵乘法的新算子,以简化许多数字代码的表示法。操作符不会针对所有类型实现,而只适用于类似数组的对象。
您可以通过实施__matmul__()
来支持您的类/对象的运算符。
PEP为非类似数组的对象留出了不同用户的空间。
当然,对于类似数组的对象,你可以用@
实现与矩阵乘法不同的任何操作,但是用户体验会受到影响,因为每个人都希望你的数据类型以不同的方式运行