2015-09-27 15 views
9

私はクラスを定義し、チルダ演算子を上書きしようとした:単項演算子をPythonでバイナリ演算子でオーバーライドする可能性はありますか?

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

次に好き、それを呼び出す:

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

我々はバイナリ1とチルダ演算子を置き換えることができますので、我々は次のように操作を行うことができますf ~ g構文エラーを発生させません。

+4

いいえ、ありません。 –

+0

Python自体を変更しないで、いいえ(あなたが望むならそうすることもできますが - 例えばhttp://stackoverflow.com/questions/214881/can-you-add-new-statements-to-pythons-syntax in introduction )。 – jonrsharpe

+0

@jonrsharpe:実行時に*変更されたオペランドの数はどうでしょうか?あなたの唯一のオプションは、 '〜'演算子の意味を完全に変更することです。実行時に1つまたは2つのオペランドを選択することはできません。 –

答えて

11

いいえ、Pythonがバイトコードをどのようにコンパイルするかを根本的に変更することはできません。すべての式は最初にであり、抽象構文木にはがパースされ、それからバイトコードにコンパイルされ、オペランドと演算子がグループ化された構文解析段階にあります。

バイトコードが実行されるまでに、2つのオペランドを受け入れることを決定できなくなりました。

関連する問題