[英]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
Python 3.5 為額外的運算符引入了符號@
。
PEP465引入了這個新的矩陣乘法運算符,以簡化許多數字代碼的表示法。 該運算符不會為所有類型實現,而只會為類似數組的對象實現。
您可以通過實現__matmul__()
來支持您的類/對象的運算符。
PEP 為非數組類對象的運算符的不同用法留出了空間。
當然,您可以使用@
實現任何不同於矩陣乘法的操作,也可以用於類似數組的對象,但用戶體驗會受到影響,因為每個人都希望您的數據類型以不同的方式運行。
如果您打算在特定類的對象上應用該操作,您可以只覆蓋與您的函數最接近的運算符……例如,覆蓋__eq__()
將覆蓋==
運算符以返回您想要的任何內容。 這適用於幾乎所有運營商。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.