我想做这样的事情:
f[frozenset((1,3,4))] = 5
f[frozenset((1,))] = 3
Run Code Online (Sandbox Code Playgroud)
但是一直输入这些内容真的很痛苦,无论如何都有别名吗?我知道在C++中有一个辅助函数可以返回一个引用,所以你只需键入:
F(1,3,4) = 5
F(1) = 3
Run Code Online (Sandbox Code Playgroud)
用F作为辅助函数.非常感谢!
mgi*_*son 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
Run Code Online (Sandbox Code Playgroud)
收益率:
{frozenset([1, 2, 3]): 4, frozenset([1]): 5}
Run Code Online (Sandbox Code Playgroud)
这引入了之间的不对称性__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]
Run Code Online (Sandbox Code Playgroud)