ritengo che questo può davvero essere ottenuto solo tramite una sottoclasse:
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
rendimenti:
{frozenset([1, 2, 3]): 4, frozenset([1]): 5}
Questo introduce un'asimmetria tra __getitem__
e __setitem__
che potrebbe essere facilmente fissato ridefinendo __getitem__
allo stesso modo.
Questo potrebbe sembrare un po 'disordinato - Infatti lo è. Perché richiedere una sottoclasse? Questo rende solo più difficile mettere gli oggetti non-frozenset
nel tuo dizionario come chiavi. Si potrebbe facilmente utilizzare questa ricetta anche per creare un oggetto proxy che fare questo con il vostro 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]
Si tratta di un eccessivo po ', non è vero? – delnan
@mgilson: eccellente, anche se sarebbe bello mostrare un esempio del suo utilizzo. –
@delnan - Sort of. Non vedo alcun altro modo per ottenere la sintassi che l'OP sta richiedendo però. – mgilson