3

したがって、コードで getattr をいじってみると、次のことがわかりました。

myVariable = foo.A.bar

動作します...しかし、次のようなもの:

B = "A"
myVariable = getattr(foo, B + ".bar")

foo に属性 A.bar が含まれていないというエラーを返します。どこが間違っていますか?ありがとう!

4

2 に答える 2

12

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')
于 2011-10-15T15:52:54.963 に答える
2

と同等:

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" を検索します。

于 2011-10-15T16:02:55.237 に答える