Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:定义我自己的操作符?_Python_Operators - Fatal编程技术网

Python:定义我自己的操作符?

Python:定义我自己的操作符?,python,operators,Python,Operators,我想定义我自己的操作符。python支持这样的东西吗?不,python提供了一个预定义但可重写的操作符。不,您不能创建新的操作符。但是,如果您只是计算表达式,您可以自己处理字符串并计算新运算符的结果。如果您打算在特定对象类上应用该操作,您可以只重写与您的函数最接近的运算符。。。例如,重写\uuu eq\uu()将重写=运算符以返回您想要的任何内容。这适用于几乎所有的运算符。虽然从技术上讲,您无法在Python中定义新的运算符,但它可以绕过这一限制。它允许您这样定义中缀运算符: # simple

我想定义我自己的操作符。python支持这样的东西吗?

不,python提供了一个预定义但可重写的操作符。

不,您不能创建新的操作符。但是,如果您只是计算表达式,您可以自己处理字符串并计算新运算符的结果。

如果您打算在特定对象类上应用该操作,您可以只重写与您的函数最接近的运算符。。。例如,重写
\uuu eq\uu()
将重写
=
运算符以返回您想要的任何内容。这适用于几乎所有的运算符。

虽然从技术上讲,您无法在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
#简单乘法
x=中缀(λx,y:x*y)
打印2 | x | 4
# => 8
#类检查
isa=中缀(λx,y:x.uuuu类uuuu==y.uuuuuu类uuuu)
打印[1,2,3]| isa |[]
打印[1,2,3][]
#=>正确

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

有关更多信息,请参见和。

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

为矩阵乘法引入了这个新的运算符,以简化许多数字代码的表示法。该操作符不会对所有类型都实现,而只是对像对象这样的数组实现

通过实现
\uu matmul\uu()
,可以支持类/对象的运算符

PEP为操作符在非数组类对象中的不同用法留出了空间


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

+1 hack非常酷,但我认为它在这种情况下不起作用。这可能是一个有趣的黑客行为,但我认为这不是一个好的解决方案。Python不允许创建自己的操作符,这是一个有充分理由做出的设计决策,您应该接受它,而不是将其视为一个问题并发明解决方法。与编写代码所用的语言对抗不是一个好主意。如果你真的想,你应该用另一种语言。@DasIch我完全不同意。我们并非都可以随意选择一种语言。另一方面,如果我不满意,我不明白为什么我应该接受其他人的设计决定真是太棒了+对于一个非常酷的黑客来说,我的问题更多的是关于定义自己的操作符是否是Python中的一个特性,而不是是否有可能伪造新的操作符,答案似乎是否定的,你不能定义新的操作符。虽然这确实非常接近。我只是将它与
toolz
中的
pipe
结合起来
pip=Infix(λx,y:pipe(x,y))
。然后
8 | pip | range | pip | sum | pip | range
。似乎有效。你是说
@
是一个新的运算符符号吗?或者我们可以用它来定义我们自己的新操作符?是的,@是一个新的操作符符号。是的,您可以使用它定义对象上的操作。考虑阅读PEP465。@ AdDEM,他只是意味着<代码> @ /代码>是一个新的运算符。就这样。事实仍然是:您不能在Python中定义自己的运算符。有关Python预定义的可重写运算符集,请参阅。您可以有一个未定义的运算符(如
$
),然后使用一些Python代码编辑自身(使用
打开
),并将所有
a$b
更改为
函数(a,b)
我很想知道
dfply
如何使用
-->
操作符:@MaxCandocia据我所知,它没有(请参阅)。那篇文章中使用
-->
的例子似乎是psuedocode。库本身只是重载了
>