我重載了一些Python運算符,算術和布爾值。 Python優先級規則保持有效,對於重載運算符來說這是不自然的,導致表達式中有很多括號。有沒有辦法「超載」Python的優先級?更改Python中的運算符優先級
回答
不是。它是Python語言本身的一部分。多數民衆贊成這種語言解析。
官方報價:Evaluation order
Python從左至右計算表達式。請注意,雖然 評估分配,但右側在 左側之前評估。
其他引號:
Python:Basics:Numbers and operators
當進行混合操作員的數學運算,它是 要注意,Python的決定哪些操作基於一個預先確定的執行 第一個,重要優先。該優先級遵循大多數編程語言的類似優先順序 。
需要注意的是Python的粘附在PEMDAS order of operations。
主要問題是python在解析代碼時應用運算符優先級。在那個早期階段,python不可能知道對象實際上涉及表達式的類型(因爲代碼還沒有執行)。因此,如果可以更改運算符優先級,則可以對所有表達式執行此操作,包括常用數學表達式。現在想象一下,如果可能的話,標準庫和任何第三方庫中會出現什麼樣的混亂。 – liori 2012-08-04 18:39:39
@liori:不錯!你不能在同一個修改後的翻譯器下使用任何第三方代碼 – jdi 2012-08-04 18:40:13
謝謝jdi,不僅要說明Python的功能,還要解釋爲什麼不能做我想做的事情。 – 2012-08-04 18:57:22
你可以欺騙這樣該機制:
- 覆蓋所有運營商不做計算,但創造的包裹在某些對象的指令列表。
- 添加自己的括號操作符(即作爲
_
函數)。
實施例:
>>> a = MyNumber(5); b = MyNumber(2); c = MyNumber(3)
>>> a + b * c
MyExpression([MyNumber(5), '+', MyNumber(2), '*', MyNumber(3)])
支架:
>>> a + _(b * c)
注意_
是評估表達式(爲了你在它執行)
所以如果反轉priorites函數您將得到:
>>> _(a + b * c)
MyNumber(21)
PS。 Django與Q
和F
運營商也有類似的伎倆。
- 1. Python運算符優先級
- 2. 更改運算符優先級爲∘
- 3. 更改運算符優先級
- 4. Python中的運算符優先級-PEMDAS
- 5. 欺騙Python的運算符優先級
- 6. Prolog運算符優先級
- 7. C++運算符優先級
- 8. JavaScript運算符優先級
- 9. php運算符優先級
- 10. PHP:運算符優先級
- 11. 運算符優先級
- 12. RethinkDB運算符優先級
- 13. C運算符優先級
- 14. 運算符優先級
- 15. Haskell中的運算符優先級
- 16. Scala中的運算符優先級
- 17. javascript中的運算符優先級
- 18. && JavaScript中的運算符優先級
- 19. 指向運算符的優先級
- 20. Perl5的=(等於)運算符優先級
- 21. And和Or的運算符優先級
- 22. Java模運算符的優先級
- 23. shell運算符的優先級
- 24. 括號內的運算符優先級
- 25. C++運算符的優先級
- 26. 運算符優先級的PHP
- 27. 比較運算符在Python和C/C++中的優先級
- 28. 在Java和Python中運算符優先級的不同結果
- 29. 更改python sys.path的優先級
- 30. 信息衝突運算符優先級
不是。它是Python語言本身的一部分。多數民衆贊成這種語言解析。 – jdi 2012-08-04 18:28:48
@jdi這是一個答案,爲什麼不能一個人呢? – kojiro 2012-08-04 18:30:57
@kojiro:那麼只是因爲我找不到官方的python文檔的鏈接,指出它不能改變。儘管我發現了大量的第三方鏈接。 – jdi 2012-08-04 18:33:00