2

この質問は、前の質問 ( Python: 独自の演算子を定義していますか? ) の拡張です。そこで提供された Infix 演算子のソリューションがとても気に入りましたが、私の式では、カスタムの単項演算子を同様の方法で定義する方法が必要です。

おすすめはありますか?既存の python 演算子を再利用しても役に立ちません。すべて使い果たしたからです。ご助力ありがとうございます!

このオーバーロードを行う主な理由は、Python に次の単項演算子がないことです: (Is > 0) (Is >= 0) これら 2 つのタイプの操作を区別するために演算子が必要であり、私の要件はインターフェイスをできるだけ一致させることです。独自の演算子セットを備えた事前定義された言語によって提供されるインターフェイスを使用して、可能な限り。演算子を > 0 および >= 0 に置き換えることもできましたが、これはユーザー コミュニティにあまり受け入れられませんでした。これを行うより良い方法はありますか?

4

1 に答える 1

1

同じハックを使用できます:

#! /usr/bin/python3.2

class Postfix:
    def __init__(self, f):
        self.f = f

    def __ror__(self, other):
        return self.f(other)

x = Postfix(lambda x: x * 2)

a = 'Hello'
print(a |x)
a = 23
print(a |x |x)

それにもかかわらず、混乱を招くだけなので、私はその使用を主張しません。

編集: 特に、演算子は単項であるため、関数を呼び出すだけで、コードを読んだ人は誰でもその機能をすぐに理解できます。

def choose(t): pass
    #magic happens here and returns nCr(t[0], t[1])

nCr = Postfix(choose)

#This is unintuitive:
print((3, 4) |nCr)

nCr = choose

#But this is obvious:
print(nCr((3, 4)))

Edit2: PEP-8 に信心深い人々へ: この「オペレーター」ハックは、PEP-8 に準拠していないことがすべてなので、回答の編集はやめてください。アイデアは|op、基本的に後置演算子の 1 つのエンティティのように読み取られるということです。


編集 3: このハックが役立つケースについてよく考えてみると、次のような使い方が中途半端に賢明かもしれません。(この機能が API で十分に文書化されている場合のみ):

#! /usr/bin/python3.2

class Language:
    def __init__(self, d):
        self.d = d

    def __ror__(self, string):
        try: return self.d[string]
        except: return string

enUS = Language({})
esMX = Language({'yes': 'sí', 'cancel': 'cancelar'})
deDE = Language({'yes': 'ja', 'no': 'nein', 'cancel': 'abbrechen'})

print('yes' |enUS)
print('no' |deDE)
print('cancel' |esMX)
于 2013-11-06T17:25:26.307 に答える