したがって、コードで getattr をいじってみると、次のことがわかりました。
myVariable = foo.A.bar
動作します...しかし、次のようなもの:
B = "A"
myVariable = getattr(foo, B + ".bar")
foo に属性 A.bar が含まれていないというエラーを返します。どこが間違っていますか?ありがとう!
A.bar
に属性がないためですfoo
。Attributebar
は、 の属性A
である が指すオブジェクトの一部ですfoo
。どちらかが必要です
getattr(foo.A, "bar")
また
getattr(getattr(foo, 'A'), 'bar')
深い属性にアクセスするための一般的なコードは、ドットで分割し、最後の部分が見つかるまで進むことです (私はメモリから書いていますが、テストしていません):
def getattr_deep(start, attr):
obj = start
for part in attr.split('.'):
obj = getattr(obj, part)
return obj
getattr_deep(foo, 'A.bar')
と同等:
myVariable = foo.A.bar
getattr を使用すると、2 つの手順が必要になります。
aObject = getattr(foo, 'A')
myVariable = getattr(aobject, 'bar')
あなたのやり方でそれを行う `myVariable = getattr(foo, B + ".bar") は 'myVariable = getattr(foo, "B.bar")' を意味します getAttr は、明らかに存在しない文字列 "B.bar" を検索します。