展平变量的层次结构

时间:2013-01-10 21:32:09

标签: python

我有一个变量层次结构,比如

a.b.c.d1
a.b.c.d2
a.b.c.d3
a.b.c.d4

现在我希望将它们全部放入本地命名空间:

d1=2
d2=3
...

我该如何实现?

2 个答案:

答案 0 :(得分:2)

你实际上可以用类似dict的方式访问Python中对象的所有字段,只要它是一个新式的类,即该类直接或间接地继承object

让我们将层次结构降低到一个级别,就像@unutbu提议的那样。然后解决方案是:

class A(object):
    d0 = 0
    def __init__(self):
        self.d1 = 1
        self.d2 = 2
        self.d3 = 3
        self.d4 = 4

a = A()

for k in a.__dict__:
    print k, a.__dict__[k]
    globals()[k] = a.__dict__[k]

print d1, d2, d3, d4
print d0

这给了我们作为输出:

d4 4
d2 2
d3 3
d1 1
1 2 3 4
Traceback (most recent call last):
  File "/../stackoverflow/14267654.py", line 24, in <module>
    print d0
NameError: name 'd0' is not defined

这意味着:新式类的实例变量可以通过特殊的a.__dict__字段访问。可以在globals()返回的字典中设置全局变量。将这些结合在一起,你就有了解决方案。

答案 1 :(得分:1)

您可以定义

d1 = a.b.c.d1
d2 = a.b.c.d2

但是

这样的作业
d1 = 2

只会影响本地变量d1,而不会影响a.b.c.d1

如果您希望分配影响a.b.c.d1,请使用

c = a.b.c
c.d1 = 2

没有办法只使用像d1这样的裸变量名称。