Tôi nghĩ rằng điều này thực sự chỉ có thể đạt được thông qua một lớp con:
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
sản lượng:
{frozenset([1, 2, 3]): 4, frozenset([1]): 5}
này giới thiệu một sự bất đối xứng giữa __getitem__
và __setitem__
mà có thể dễ dàng được cố định bằng cách tái định nghĩa __getitem__
theo cách tương tự.
Điều này có vẻ hơi lộn xộn - Thật vậy. Tại sao yêu cầu một phân lớp? Điều đó chỉ gây khó khăn hơn khi đặt các đối tượng không phải là frozenset
vào từ điển của bạn làm khóa. Bạn có thể dễ dàng sử dụng công thức này mặc dù để tạo ra một đối tượng proxy mà sẽ làm điều này với dict của bạn:
#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]
Đây là một quá mức cần thiết phải không? – delnan
@mgilson: Tuyệt vời, mặc dù nó sẽ là tốt để hiển thị một ví dụ về cách sử dụng của nó. –
@delnan - Sắp xếp. Tôi không thấy bất kỳ cách nào khác để có được cú pháp mà OP đang yêu cầu mặc dù. – mgilson