2012-08-04 18 views
9

私はいくつかのPython演算子、算術演算とブール演算をオーバーロードしました。 Pythonの優先順位の規則は有効なままです。これは、オーバーロードされた演算子にとって不自然であり、式の中に大量のカッコがあります。 Pythonの優先順位を「オーバーロード」する方法はありますか?Pythonの演算子の優先順位を変更する

+5

いいえ、それはPython言語自体の一部です。どのように言語が解析されるか – jdi

+1

@jdiそれは答えです、それを一つにしてみませんか? – kojiro

+0

@kojiro:正式なpythonのドキュメントへのリンクを見つけることができないので、それは変更できません。私はそれを述べているサードパーティのリンクのトンを見つけた。 – jdi

答えて

8

いいえ、それはPython言語自体の一部です。どのように言語が解析されるか

公式引用:Evaluation order

Pythonは左から右に式を評価します。割り当てを評価する の間に、右側は の左側の前に評価されます。

その他の引用:

Python:Basics:Numbers and operators

混合事業者と数学的演算を実行する場合、Pythonは予め決定に基づいて、第一 を実行するためにどのオペレーションを判定することに留意することが 重要です優先順位。この優先順位は、ほとんどのプログラミング言語と同様の優先順位 に従います。

Python Programming/Operators

PythonはPEMDAS order of operationsに付着に注意してください。

+6

主な問題は、pythonはコードの解析中に演算子の優先順位を適用することです。その初期の段階では、Pythonはオブジェクトが実際に式に含まれる型を知ることはできません(コードはまだ実行されていないため)。したがって、演算子の優先順位を変更することができた場合は、一般的な数式を含むすべての式に対して演算子の優先順位を設定します。これが可能であれば、標準ライブラリとサードパーティ図書館では、どんな混乱が起こるのか想像してみましょう。 – liori

+0

@liori:素敵な追加!同じ変更されたインタプリタの下であなたのものと混ざっているサードパーティのコードを使用することはできません – jdi

+0

jdiはPythonが何をしているのかだけでなく、なぜ私が何をしたいのかを説明してくれてありがとうございます。 –

6

あなたは、このようにそのメカニズムをごまかすことができます。すべての事業者が計算を行うが、いくつかのオブジェクトにラップ命令のリストを作成しないために

  1. オーバーライドを。
  2. 独自のブラケット演算子(つまり、_関数)を追加します。

例:

>>> a = MyNumber(5); b = MyNumber(2); c = MyNumber(3) 
>>> a + b * c 
MyExpression([MyNumber(5), '+', MyNumber(2), '*', MyNumber(3)]) 

ブラケット:_だからあなたがprioritesを逆転場合

(オーダーあなたがそれに強制で)式を評価する関数である

>>> a + _(b * c) 

に留意されたいです。あなたは得るでしょう:

>>> _(a + b * c) 
MyNumber(21) 

PS。 DjangoはQFの演算子で同様のトリックを行います。

関連する問題