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
Odpowiedz
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.
Zauważ, że Python przylega do PEMDAS order of operations.
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
@liori: Niezły dodatek! Nie można użyć kodu obcego wymieszanego z tym samym zmienionym interpreterem. – jdi
Dziękuję jdi za nie tylko stwierdzenie, co robi Python, ale wyjaśnienie, dlaczego nie jest możliwe zrobienie tego, co chciałbym robić. –
Można oszukać tego mechanizmu w następujący sposób:
- odłączać wszystkie operatorom nie robić obliczenia ale stworzyć listę instrukcji zawinięte w jakiś przedmiot.
- 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
.
Nie. Jest to część samego języka Pythona. Tak wygląda język. – jdi
@jdi To jest odpowiedź, dlaczego nie zrobić tego? – kojiro
@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