私はこのようなことをしたい:
f[frozenset((1,3,4))] = 5
f[frozenset((1,))] = 3
しかし、これらを常に入力するのは面倒です。これにエイリアスを設定する方法はありますか? C ++では、参照を返すヘルパー関数を使用できるため、次のように入力するだけで済みます。
F(1,3,4) = 5
F(1) = 3
F をヘルパー関数として使用します。どうもありがとう!
私はこのようなことをしたい:
f[frozenset((1,3,4))] = 5
f[frozenset((1,))] = 3
しかし、これらを常に入力するのは面倒です。これにエイリアスを設定する方法はありますか? C ++では、参照を返すヘルパー関数を使用できるため、次のように入力するだけで済みます。
F(1,3,4) = 5
F(1) = 3
F をヘルパー関数として使用します。どうもありがとう!
これは実際にはサブクラスを介してのみ達成できると思います:
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]
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']