2012-08-04 4 views
9

Ich habe einige Python-Operatoren, arithmetische und boolesche, überladen. Die Python-Vorrangregeln bleiben in Kraft, was für die überladenen Operatoren unnatürlich ist und zu vielen Klammern in Ausdrücken führt. Gibt es eine Möglichkeit, Pythons Vorbedingungen zu überladen?Ändern der Operatorpriorität in Python

+5

Nein. Es ist Teil der Python-Sprache selbst. So parst die Sprache. – jdi

+1

@jdi Das ist eine Antwort, warum nicht eins machen? – kojiro

+0

@kojiro: Nun, nur weil ich keinen Link zu offiziellen Python-Dokumenten finden konnte, der besagt, dass es nicht geändert werden kann. Ich fand Tonnen von 3rd-Party-Links, die es aber angeben. – jdi

Antwort

8

Nein. Es ist Teil der Python-Sprache selbst. So parst die Sprache.

Offizielle Zitat: Evaluation order

Python wertet Ausdrücke von links nach rechts. Beachten Sie, dass während der Auswertung einer Zuweisung die rechte Seite vor der linken Seite ausgewertet wird.

Andere Zitate:

Python:Basics:Numbers and operators

Wenn mathematische Operationen mit gemischten Operatoren durchgeführt wird, ist es wichtig zu beachten, dass Python, welche Operationen bestimmt zuerst durchzuführen, basierend auf einem vorher festgelegten Vorrang. Dieser Vorrang folgt einem ähnlichen Vorrang den meisten Programmiersprachen.

Python Programming/Operators

Beachten Sie, dass Python auf die PEMDAS order of operations haftet.

+6

Das Hauptproblem ist, dass Python beim Parsen von Code die Vorrangstellung des Operators anwendet.Zu diesem frühen Zeitpunkt ist es für Python nicht möglich zu wissen, um welche Typen die Objekte tatsächlich am Ausdruck beteiligt sind (da der Code noch nicht ausgeführt wurde). Wenn es möglich wäre, die Vorrangstellung des Operators zu ändern, würden Sie dies für alle Ausdrücke, einschließlich allgemeiner mathematischer Ausdrücke, tun. Stellen Sie sich nun vor, welches Chaos in der Standardbibliothek und in einer beliebigen Drittanbieterbibliothek entstehen würde, wenn dies möglich wäre. – liori

+0

@liori: Schöne Ergänzung! Du kannst keinen Code von Drittanbietern verwenden, der mit deinem unter dem gleichen geänderten Interpreter gemischt ist. – jdi

+0

Danke jdi, dass du nicht nur gesagt hast, was Python macht, sondern erklärst, warum es nicht möglich ist, das zu tun, was ich tun möchte. –

6

Sie können diesen Mechanismus auf diese Weise betrügen:

  1. außer Kraft setzen alle Betreiber nicht die Berechnungen aber Liste von Anweisungen in einem Gegenstand gewickelt erstellen.
  2. Fügen Sie Ihren eigenen Klammeroperator hinzu (dh als _ Funktion).

Beispiel:

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

Brackets:

>>> a + _(b * c) 

Beachten Sie, dass _ eine Funktion, die Ausdruck auswertet (um Sie darin erzwingen)

Also, wenn Sie Prioritätsachsen umkehren Sie erhalten:

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

PS. Django macht einen ähnlichen Trick mit Q und F Operatoren.