2012-08-04 29 views
9

我重載了一些Python運算符,算術和布爾值。 Python優先級規則保持有效,對於重載運算符來說這是不自然的,導致表達式中有很多括號。有沒有辦法「超載」Python的優先級?更改Python中的運算符優先級

+5

不是。它是Python語言本身的一部分。多數民衆贊成這種語言解析。 – jdi 2012-08-04 18:28:48

+1

@jdi這是一個答案,爲什麼不能一個人呢? – kojiro 2012-08-04 18:30:57

+0

@kojiro:那麼只是因爲我找不到官方的python文檔的鏈接,指出它不能改變。儘管我發現了大量的第三方鏈接。 – jdi 2012-08-04 18:33:00

回答

8

不是。它是Python語言本身的一部分。多數民衆贊成這種語言解析。

官方報價:Evaluation order

Python從左至右計算表達式。請注意,雖然 評估分配,但右側在 左側之前評估。

其他引號:

Python:Basics:Numbers and operators

當進行混合操作員的數學運算,它是 要注意,Python的決定哪些操作基於一個預先確定的執行 第一個,重要優先。該優先級遵循大多數編程語言的類似優先順序 。

Python Programming/Operators

需要注意的是Python的粘附在PEMDAS order of operations

+6

主要問題是python在解析代碼時應用運算符優先級。在那個早期階段,python不可能知道對象實際上涉及表達式的類型(因爲代碼還沒有執行)。因此,如果可以更改運算符優先級,則可以對所有表達式執行此操作,包括常用數學表達式。現在想象一下,如果可能的話,標準庫和任何第三方庫中會出現什麼樣的混亂。 – liori 2012-08-04 18:39:39

+0

@liori:不錯!你不能在同一個修改後的翻譯器下使用任何第三方代碼 – jdi 2012-08-04 18:40:13

+0

謝謝jdi,不僅要說明Python的功能,還要解釋爲什麼不能做我想做的事情。 – 2012-08-04 18:57:22

6

你可以欺騙這樣該機制:

  1. 覆蓋所有運營商不做計算,但創造的包裹在某些對象的指令列表。
  2. 添加自己的括號操作符(即作爲_函數)。

實施例:

>>> 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與QF運營商也有類似的伎倆。