Python:定义自己的运算符?

cwj*_*cwj 71 python operators

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

Aym*_*ieh 168

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

# 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
Run Code Online (Sandbox Code Playgroud)

  • @DasIch我不能不同意.我们并非都有意自由选择语言.另一方面,如果我不满意,我不明白为什么我应该和其他人的设计决定达成和解. - 确实很棒的黑客! (67认同)
  • 这可能是一个有趣的黑客,但我不认为这是一个很好的解决方案.Python不允许创建自己的运算符,这是一个有充分理由的设计决策,你应该接受它,而不是将其视为一个问题,并围绕它发明方法.与你编写代码的语言作斗争并不是一个好主意.如果你真的想要,你应该使用不同的语言. (8认同)
  • +1那个hack非常酷,但我不认为它会在这种情况下起作用. (2认同)
  • 我只是将它与`toolz`中的`pipe`结合起来.`pip = Infix(lambda x,y:pipe(x,y))`.然后`8 | pip | 范围| pip | 总和| pip | range`.似乎工作. (2认同)

dfa*_*dfa 41

不,Python附带了一组预定义但可覆盖的运算符.

  • @MaxCandocia据我所知,它没有(参见[文档](https://github.com/kieferk/dfply/blob/bec4d59ab20a9b718742af96741250d022fd12a7/README.md#overview-of-functions))。该帖子中使用“--&gt;”的示例似乎是伪代码。库本身只是重载“&gt;&gt;”。 (2认同)

Zif*_*fre 33

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


Sud*_*han 10

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


bil*_*jmc 10

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
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Sage文档此增强跟踪凭单.


gg3*_*349 8

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

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

您可以通过实现支持类/对象的运算符__matmul__().

对于非类数组对象,PEP为操作符的不同用法留出空间.

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

  • @Addem他只是说`@`是一个新的运算符.而已.事实仍然存在:您无法在Python中定义自己的运算符. (3认同)