2

我有一个用于 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....

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

4

2 回答 2

4

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

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

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

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

于 2012-04-06T11:05:01.460 回答
1

考虑使用如下类

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

这将允许您简单地将标题包装在其中。正如其他人所指出的那样,这仍然不允许您访问包含破折号的属性,但是您可以使用getattrinstaed 访问这些属性。考虑以下包含在 中的标头ADict

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

可以使用熟悉的点语法访问诸如接受之类的属性,而可以通过以下方式访问无效的标识符属性getattr

>>>> aheader.accept
'text/html'
>>>> getattr(aheader, 'content-length')
30
于 2012-04-06T11:38:57.710 回答