2012-08-04 4 views
9

Przeciążono niektóre operatory w języku Python, arytmetyczne i boolowskie. Reguły pierwszeństwa Pythona pozostają w mocy, co jest nienaturalne w przypadku przeciążonych operatorów, prowadząc do wielu nawiasów w wyrażeniach. Czy istnieje sposób na "przeładowanie" precedensów Pythona?Zmiana priorytetu operatorów w Pythonie

+5

Nie. Jest to część samego języka Pythona. Tak wygląda język. – jdi

+1

@jdi To jest odpowiedź, dlaczego nie zrobić tego? – kojiro

+0

@kojiro: Cóż, tylko dlatego, że nie mogłem znaleźć linku do oficjalnych dokumentów Pythona stwierdzających, że nie można go zmienić. Znalazłem mnóstwo linków do stron trzecich stwierdzających to. – jdi

Odpowiedz

8

Nie. Jest to część samego języka Pythona. Tak wygląda język.

Dziennik cytat: Evaluation order

Python ocenia wyrażenia od lewej do prawej. Zauważ, że podczas gdy dokonuje oceny przypisania, prawa strona jest oceniana przed lewą stroną .

Inne cytaty:

Python:Basics:Numbers and operators

Podczas wykonywania operacji matematycznych z operatorami mieszanych, to pamiętać, że Python określa, jakie operacje wykonać pierwsze, na podstawie wstępnie ustalona precedens. To pierwszeństwo jest podobne do większości języków programowania.

Python Programming/Operators

Zauważ, że Python przylega do PEMDAS order of operations.

+6

Głównym problemem jest to, że python stosuje pierwszeństwo operatora podczas analizowania kodu.W tym wczesnym momencie python nie jest w stanie wiedzieć, jakie typy obiektów faktycznie są zaangażowane w wyrażenie (ponieważ kod nie został jeszcze wykonany). Dlatego jeśli można było zmienić pierwszeństwo operatora, zrobiłbyś to dla wszystkich wyrażeń, łącznie ze zwykłymi wyrażeń matematycznych. Teraz wyobraźcie sobie, jaki chaos wystąpiłby w standardowej bibliotece i bibliotece osób trzecich, gdyby było to możliwe. – liori

+0

@liori: Niezły dodatek! Nie można użyć kodu obcego wymieszanego z tym samym zmienionym interpreterem. – jdi

+0

Dziękuję jdi za nie tylko stwierdzenie, co robi Python, ale wyjaśnienie, dlaczego nie jest możliwe zrobienie tego, co chciałbym robić. –

6

Można oszukać tego mechanizmu w następujący sposób:

  1. odłączać wszystkie operatorom nie robić obliczenia ale stworzyć listę instrukcji zawinięte w jakiś przedmiot.
  2. Dodaj własny operator nawiasów (np. Jako funkcja _).

Przykład:

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

Wsporniki:

>>> a + _(b * c) 

Zauważ, że _ to funkcja, która ocenia wypowiedzi (w kolejności wymusić na nim)

Więc jeśli odwrócić priorites otrzymasz:

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

PS. Django robi podobny trik z operatorami Q i F.