3

当导入我正在编写的 python 模块时,我想根据在同一模块中定义的字典的内容为模块创建一组属性。这是模块中字典的一小部分:

list_of_constellations = {
   0: Constellation("And", "Andromeda"),
   1: Constellation("Ant", "Antlia"),
   2: Constellation("Aps", "Apus"),
   3: Constellation("Aql", "Aquila"),
}

其中 Constellation 是一个命名元组。我想要的是向命名空间注入一组新的属性,其名称是元组中的第一个元素,其值是键。因此,导入后,可以使用以下属性:

import constellations

print constellations.And   # prints 0
print constellations.Ant   # prints 1

我该怎么做?

4

2 回答 2

3

在模块本身中,globals()函数将模块命名空间作为字典返回;只需使用每个命名元组的第一个元素作为键来设置整数值:

for key, const in list_of_constellations.items():
    globals()[const[0]] = v  # set "And" to 0, etc.

或从模块外部,用于setattr()向模块添加属性:

import constellations

for key, const in constellations.list_of_constellations.items():
    setattr(constellations, constellation[0], v)  # set "And" to 0, etc.
于 2013-01-30T22:56:33.143 回答
1

在 Python 2.7 中:

>>> import constellations
>>> dir(constellations)
['Constellation', 'list_of_constellations', 'namedtuple', 'namespace', ...]
>>> for key, tupl in constellations.list_of_constellations.iteritems():
>>>    setattr(constellations, tupl[0], key)
>>> dir(constellations)
['And', 'Ant', 'Aps', 'Aql', 'Constellation', 'list_of_constellations',
'namedtuple', 'namespace', ...]

对于 Python3,替换iteritems()items().

您可以vars(constellations).update(dict)单独使用 over 设置属性,其中dict包含要以 name:value 格式插入的属性的字典对象。

于 2013-01-30T23:15:34.553 回答