Myślę, że to naprawdę może być osiągnięty tylko przez podklasy:
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
Wynik:
{frozenset([1, 2, 3]): 4, frozenset([1]): 5}
ten wprowadza asymetrię między __getitem__
i __setitem__
które mogłyby być łatwo ustalony przez ponowne zdefiniowanie __getitem__
w ten sam sposób.
Może się to wydawać trochę Messy - Rzeczywiście jest. Dlaczego potrzebna jest podklasa? To sprawia, że trudniej jest umieścić obiekty nie będące obiektami frozenset
w słowniku jako klucze. Można łatwo wykorzystać ten przepis, choć utworzyć obiekt proxy, który zrobi to z 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]
jest to przesada tad, prawda? – delnan
@mgilson: Doskonały, chociaż dobrze byłoby pokazać przykład jego użycia. –
@delnan - sortowanie. Nie widzę żadnego innego sposobu na uzyskanie składni, której żąda OP. – mgilson