8

私はこのようなことをしたい:

f[frozenset((1,3,4))] = 5
f[frozenset((1,))] = 3

しかし、これらを常に入力するのは面倒です。これにエイリアスを設定する方法はありますか? C ++では、参照を返すヘルパー関数を使用できるため、次のように入力するだけで済みます。

F(1,3,4) = 5
F(1) = 3

F をヘルパー関数として使用します。どうもありがとう!

4

2 に答える 2

13

これは実際にはサブクラスを介してのみ達成できると思います:

class FrozenSetDict(dict):
    def __setitem__(self,idx,value):
        try:
            dict.__setitem__(self,frozenset(idx),value)
        except TypeError:
            dict.__setitem__(self,frozenset((idx,)),value)

d = FrozenSetDict()
d[1,2,3] = 4
d[1] = 5
print d

収量:

{frozenset([1, 2, 3]): 4, frozenset([1]): 5}

これにより、 と の間に非対称性が生じますが__getitem__、これは同じ方法で__setitem__再定義することで簡単に修正できます。__getitem__

これは少し面倒に思えるかもしれません -- 実際、そうです。サブクラスが必要な理由 frozensetこれにより、非オブジェクトをキーとして辞書に入れることが難しくなります。ただし、このレシピを使用して、dict でこれを行うプロキシ オブジェクトを簡単に作成できます。

#I don't like the name of this class -- I'm open to suggestions :)
class FrozenSetProxy(object):
    def __init__(self,obj):
        self.obj = obj

    def __setitem__(self,idx,value):
        try:
            self.obj[frozenset(idx)] = value
        except TypeError:
            self.obj[frozenset((idx,))] = value

    def __getitem__(self,idx):
        try:
            return self.obj[frozenset(idx)]
        except TypeError:
            return self.obj[frozenset((idx,))]

d = dict()
F = FrozenSetProxy(d)
F[1,2,3] = 4
F[1] = 5
print d
print F[1]
于 2013-01-21T18:50:07.740 に答える
4

Python には C++ 参照のようなものはなく、使用する構文はブートするのに違法です (パーサーの言葉で: can't assign to function call)。オブジェクトまたはサブクラスでエミュレートしdictその__getitem__. しかし、より単純で邪魔にならない方法があります。ヘルパーにも値を渡し、代入を処理させます。

def blah(f):
    def F(*args, value):
        f[frozenset(args)] = value
    F(1, 3, 4, value=5)
    F(1, value=3)

これは Python 3 の機能であるキーワードのみのパラメーターを使用することに注意してください。Python 2 で動作させる必要がある場合は、以下を受け入れることで呼び出し構文をエミュレートできます**kwdargs

def F(*args, **kwds):
    # optional: check that no other keyword arguments were passed
    f[frozenset(args)] = kwds['value']
于 2013-01-21T18:51:39.693 に答える