2015-09-27 18 views
9

próbowałem zdefiniować klasę i zastąpić tyldy operatora:Czy istnieje możliwość zastąpienia operatora unarnego binarnym w Pythonie?

class foo: 
    def __invert__(self, other) 
     return 1232 # a random number , just as test 

Następnie nazywając ją lubię:

>>> f = foo() 
>>> g = foo() 
>>> f ~ g 
    File "<input>", line 1 
    f ~ g 
    ^
SyntaxError: invalid syntax 

możemy zastąpić operator tyldy z jednej binarnej więc możemy zrobić operację jak f ~ g bez zgłaszania błędu składni.

+4

Nie, nie ma. –

+0

Nie bez modyfikowania samego Pythona, nie (chociaż możesz to zrobić, jeśli chcesz - zobacz np. Http://stackoverflow.com/questions/214881/can-you-add-new-statements-to-pythons-syntax dla wprowadzenia). – jonrsharpe

+0

@jonrsharpe: a nawet wtedy, jak by liczba operandów zmienionych * w czasie wykonywania *? Jedyną opcją jest zmiana operatora '~', co oznacza, że ​​nie możesz wybrać między 1 lub 2 operandami w czasie wykonywania. –

Odpowiedz

11

Nie, nie można tego zrobić, nie bez radykalnej zmiany sposobu, w jaki Python kompiluje kod bajtowy. Wszystkie wyrażenia są najpierw parsowane do drzewa składni abstrakcyjnej, a następnie kompilowane do kodu bajtowego z tego, i to jest na etapie analizowania, operandy i operatory są zgrupowane.

Do czasu uruchomienia kodu bajtowego nie można już zdecydować o zaakceptowaniu dwóch argumentów operacji.