繁体   English   中英

从 Python 个字典键创建变量

[英]Creating variables from Python dictionary keys

我有一个容器 class 用于 url 及其标头,资源:

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

        # etc....

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

Python 标识符中不能有-符号! 所以我们可以用键中的_替换它。
将键更改为小写使它们看起来像传统的变量名,而且非常重要的是,消除了大写/小写的混淆(因为标头通常与大写键一起发送)。

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

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

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

考虑使用如下所示的 class

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

这样您就可以简单地将 header 包装在其中。 正如其他人所指出的那样 - 仍然不允许您访问包含破折号的属性,但是您可以使用getattr instaed 来访问这些属性。 考虑以下 header,包装在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM