所以我创建了自己的基于dict的命名元组类:
class t(dict):
def __getattr__(self, v):
try:
return self[v]
except KeyError:
raise AttributeError("Key " + str(v) + " does not exist.")
def __init__(self, *args, **kwargs):
for source in args:
for i, j in source.items():
self[i] = j
for i, j in kwargs.items():
self[i] = j
>>> thing = t(cow=10, moo='moooooooo')
>>> thing.cow
10
>>> thing.moo
'moooooooo'
使用dict的意义在于我可以使用** splat运算符,因此整个事情可以作为dict的json'd。 init中的double for循环是这样我可以在反序列化后立即从dict重新构造它。
我唯一缺少的是你可以用元组做的多任务,比如
>>> thing = (1, 3, ('blargh', 'mooo'))
>>> a, b, (c, d) = thing
>>> a
1
>>> b
3
>>> c
'blargh'
>>> d
'mooo'
有什么方法可以用我自己的自定义数据类型获得这种行为?是否有任何我可以覆盖的函数或某些我可以继承的类来获取此行为?
答案 0 :(得分:11)
是。实施__iter__()
。
class unpackable_dict(dict):
def __iter__(self):
return (self[key] for key in sorted(self.keys()))
d = unpackable_dict(a=1, b=2)
a, b = d
你通常无法从dict中解压缩值的原因就像你的元组一样,dicts没有定义的顺序。我已经使用了一个生成器表达式来按照键的排序顺序获取项目。不过,您可以考虑使用OrderedDict
。