私は変数の階層を持っています。
a.b.c.d1
a.b.c.d2
a.b.c.d3
a.b.c.d4
今、私はそれらをすべてローカル名前空間に入れたいと思っています:
d1=2
d2=3
...
どうすればそれを達成できますか?
私は変数の階層を持っています。
a.b.c.d1
a.b.c.d2
a.b.c.d3
a.b.c.d4
今、私はそれらをすべてローカル名前空間に入れたいと思っています:
d1=2
d2=3
...
どうすればそれを達成できますか?
object
Python では、オブジェクトが新しいスタイルのクラスである限り、つまりクラスが を直接的または間接的に継承している限り、オブジェクトのすべてのフィールドに dict のような方法で実際にアクセスできます。
@unutbu が提案したように、階層を 1 つのレベルに減らしましょう。次に、解決策は次のようになります。
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()
。これらを組み合わせれば、ソリューションが完成します。
あなたは定義することができます
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
。