是"容器"班级不是pythonic?

时间:2016-03-17 16:33:39

标签: python dictionary

假设我想使用像对象这样的可变字典来在进程之间传递数据,但是我创建了一个空的" Container"而不是使用内置的字典类型。上课,像这样:

class Container(object):
  pass

x = Container()
x.a = 42
x.b = ['Hitch', 'Hiker']

现在,我可以使用x.a而不是写出x['a'],这对我来说似乎更清晰一些。假设我不希望循环关键值,那么使用这个"容器"是否有任何重大缺点。与标准词典?

4 个答案:

答案 0 :(得分:3)

是的,这是一个完美的pythonic事情。实际上它是recommended in the Python tutorial

答案 1 :(得分:3)

如果你想这样做并仍然可以获得字典的优点,我会将dict子类化:

class Container(dict):
    def __getattr__(self, name):
        return self[name]
    def __setattr__(self, name, value):
        self[name] = value


x = Container()

x.a = 42
x.b = ['Hitch', 'Hiker']

print(x)

打印:

{'b': ['Hitch', 'Hiker'], 'a': 42}

您可能希望单独处理现有属性,因此您仍然可以更改它们:

def __setattr__(self, name, value):
    if name not in dir(self):
        self[name] = value
    else:
        super().__setattr__(name, value)

答案 2 :(得分:2)

对于快速简单的容器,我没有看到任何错误。主要的缺点是你没有得到所有其他dict方法(比如.get().items()等),你的密钥必须是有效的Python标识符。

请注意,还有一些库提供了类似的功能和更多便利功能(例如attrdict)。

答案 3 :(得分:1)

恰恰相反;标准库的argparse模块中的{{1}}类本质上就是这样一个容器(在忽略一些内部使用的魔法和私有方法之后)。