2015-09-27 18 views
9

Ich habe versucht, eine Klasse und überschreiben Sie die Tilde Operator zu definieren: es mag AufrufGibt es eine Möglichkeit, in Python einen unären Operator mit einer binären Eins zu überschreiben?

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

Dann:

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

Können wir den Tilde-Betreiber mit einer binären Eins ersetzen, so können wir eine Operation tun, wie f ~ g ohne einen Syntaxfehler zu verursachen.

+4

Nein, gibt es nicht. –

+0

Nicht ohne Python selbst zu modifizieren, nein (obwohl du das tun kannst, wenn du willst - siehe zB http://stackoverflow.com/questions/214881/can-you-add-new-statements-to-pythons-syntax für eine Einführung). – jonrsharpe

+0

@jonrsharpe: und wie würde dann die Anzahl der Operanden * zur Laufzeit * geändert? Ihre einzige Option wäre, den Operator '~' vollständig zu ändern, Sie können zur Laufzeit nicht zwischen 1 oder 2 Operanden wählen. –

Antwort

11

Nein, Sie können das nicht tun, nicht ohne radikal zu ändern, wie Python Bytecode kompiliert. Alle Ausdrücke werden zuerst in einen abstrakten Syntaxbaum geparst, dann in Bytecode kompiliert, und es ist in der Parsingstufe, dass Operanden und Operatoren gruppiert sind.

Wenn der Bytecode ausgeführt wird, können Sie nicht länger entscheiden, zwei Operanden zu akzeptieren.