web-dev-qa-db-ja.com

Python:独自の演算子を定義していますか?

独自の演算子を定義したいと思います。 pythonはそのようなことをサポートしていますか?

65
cwj

いいえ、新しい演算子を作成することはできません。ただし、式を評価するだけの場合は、文字列を自分で処理して、新しい演算子の結果を計算できます。

31
Zifre

技術的には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
159
Ayman Hourieh

いいえ、Pythonには、事前定義済みのオーバーライド可能な 演算子のセット が付属しています。

40
dfa

オブジェクトの特定のクラスに操作を適用する場合は、最も近い関数に一致する演算子をオーバーライドできます。たとえば、__eq__()をオーバーライドすると、==演算子がオーバーライドされます。あなたが望むものは何でも返します。これは、ほぼすべてのオペレーターで機能します。

9
Sudhir Jonathan

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

詳細については、 Sageのドキュメント および この拡張追跡チケット を参照してください。

8
billyjmc

Python 3.5では、余分な演算子にシンボル_@_が導入されています。

PEP465 行列乗算にこの新しい演算子を導入し、多くの数値コードの表記を簡素化しました。演算子は、すべてのタイプに実装されるのではなく、配列のようなオブジェクトにのみ実装されます。

__matmul__()を実装することにより、クラス/オブジェクトの演算子をサポートできます。

PEPは、配列のようなオブジェクトに対して演算子の異なる使用法のためのスペースを残します。

もちろん、_@_を使用して実装することもできますが、配列のようなオブジェクトに対しても行列乗算とは異なる任意の種類の操作を実装できますが、データ型が異なる方法で動作することを誰もが期待するため、ユーザーエクスペリエンスに影響が及びます。

7
gg349