使用__getattribute__进行namedtuple:糟糕的做法?

时间:2017-03-10 18:11:49

标签: python namedtuple getattribute

我正在探索用namedtuples替换大量小字典的可能性。

因为dict键(字符串)已经映射到了namedtuples的字段名称,所以我必须使用namedtuple的dundered getattribute方法来访问这些值。

这不仅使代码看起来很奇怪,而且我还想知道这是不是很糟糕的做法?

1 个答案:

答案 0 :(得分:3)

  

因为dict键(字符串)已经映射到了namedtuples的字段名称,所以我必须使用namedtuple的dundered getattribute方法来访问这些值。

这是错误的工具。您应该使用getattr内置函数,而不是__getattribute__方法:

getattr(your_namedtuple, attribute_name)

也就是说,如果你想主要通过名称而不是索引来访问你的数据,那么一直调用getattr会很尴尬。您可以继承namedtuple类,并更改__getitem__的工作方式,这样您仍然可以使用索引表示法:

class MyType(namedtuple(...)):
    __slots__ = () # avoid creating instance __dict__s
    def __getitem__(self, index):
        try:
            return super().__getitem__(index)
        except TypeError:
            return getattr(self, index)