getattr
の値を直接取得するのではなく、ラッパーを使用する必要がありid
ます。
a = getattr(myobject, 'id', None)
id
これは、「オブジェクトから属性を取得したいのですが、オブジェクト内にmyobject
属性がない場合は、代わりに戻る」と言っているようなものです。しかし、それは効率的に行われます。id
myobject
None
getattr
一部のオブジェクトは、次の形式のアクセスもサポートしています。
a = myobject.getattr('id', None)
OPリクエストに従って、'deep getattr':
def deepgetattr(obj, attr):
"""Recurses through an attribute chain to get the ultimate value."""
return reduce(getattr, attr.split('.'), obj)
# usage:
print deepgetattr(universe, 'galaxy.solarsystem.planet.name')
簡単な説明:
Reduceは、インプレース再帰関数のようなものです。この場合、obj
(ユニバース)から開始し、を使用してアクセスしようとする属性ごとに再帰的に深くなるためgetattr
、質問では次のようになります。
a = getattr(getattr(myobject, 'id', None), 'number', None)