从Python字典键创建变量

时间:2012-04-06 11:02:23

标签: python dictionary

我有一个容器类,用于url及其标题,Resource:

class Resource(object):
    def __init__(self, url, headers):
        self.url = url
        self.content-length = headers['content-length']
        self.content-type = headers['content-type']

        # etc....

headers方法的__init__参数需要从getinfo() urllib2.urlopen()方法返回dict。我认为这将是一种更可读的方式来打包资源URL和标头。一遍又一遍地打字self.someheader = headers['someheader']让我想知道是否有某种方法可以自动从这样的字典键创建变量。这可能吗?

2 个答案:

答案 0 :(得分:4)

Python标识符中不能包含-符号!因此,我们可以将其替换为键中的_ 将键更改为小写使它们看起来像一个传统的变量名称,并且,非常重要的是,删除大写/小写混淆(因为标题通常使用大写键发送)。

for k, v in headers.items():
    setattr(self, k.lower().replace('-', '_'), v)

如果你正在使用Python 2,iteritems在这里更好,因为它不会创建一个新的项列表,但只是让你迭代它们,默认情况下Python 3会这样做。

将这些密钥存储在“私有” dict (例如self._headers)中可能是个好主意。然后,您可以使用__getattr____setattr__更好地控制流程,例如,在尝试设置无效密钥时可能会引发异常。

答案 1 :(得分:1)

考虑使用如下的类

class ADict(dict):
    def __getattr__(self, field):
        return self.get(field)

然后允许您简单地将标题包装在其中。正如其他人所指出的那样,这仍然不允许您访问包含短划线的属性,但是您可以使用getattr instaed来访问这些属性。考虑以下标题,包含在ADict中:

header = {'content-type': 'text/javascript', 'content-length': 30, 'accept': 'text/html'}
aheader = ADict(header)

可以使用熟悉的点语法访问诸如accept之类的属性,而可以通过getattr

访问无效的标识符属性
>>>> aheader.accept
'text/html'
>>>> getattr(aheader, 'content-length')
30