簡體   English   中英

Python:定義我自己的運算符?

[英]Python: defining my own operators?

我想定義我自己的運算符。 python支持這樣的東西嗎?

雖然從技術上講你不能在 Python 中定義新的運算符,但這個聰明的 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

不,Python 帶有一組預定義但可覆蓋的運算符

不,您不能創建新的運算符。 但是,如果您只是評估表達式,您可以自己處理字符串並計算新運算符的結果。

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 文檔此增強跟蹤票證

Python 3.5 為額外的運算符引入了符號@

PEP465引入了這個新的矩陣乘法運算符,以簡化許多數字代碼的表示法。 該運算符不會為所有類型實現,而只會為類似數組的對象實現。

您可以通過實現__matmul__()來支持您的類/對象的運算符。

PEP 為非數組類對象的運算符的不同用法留出了空間。

當然,您可以使用@實現任何不同於矩陣乘法的操作,也可以用於類似數組的對象,但用戶體驗會受到影響,因為每個人都希望您的數據類型以不同的方式運行。

如果您打算在特定類的對象上應用該操作,您可以只覆蓋與您的函數最接近的運算符……例如,覆蓋__eq__()將覆蓋==運算符以返回您想要的任何內容。 這適用於幾乎所有運營商。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM