Python:重载元组多任务功能?

时间:2011-08-19 05:31:44

标签: python tuples

所以我创建了自己的基于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'

有什么方法可以用我自己的自定义数据类型获得这种行为?是否有任何我可以覆盖的函数或某些我可以继承的类来获取此行为?

1 个答案:

答案 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