Należy użyć getattr
opakowanie zamiast bezpośredniego pobierania wartości id
.
a = getattr(myobject, 'id', None)
To jakby powiedzieć: „Chciałbym, aby pobrać atrybut id
od obiektu myobject
, ale jeśli nie ma atrybut id
wewnątrz obiektu myobject
, a następnie powrócić None
zamiast”. Ale robi to sprawnie.
Niektóre obiekty także wspierać następujące formy getattr
dostępu:
a = myobject.getattr('id', None)
Jak na żądanie 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')
Proste wyjaśnienie:
Reduce jest jak w miejscu funkcja rekursywna.Co robi w tym przypadku jest zacząć od obj
(wszechświata), a następnie rekurencyjnie dostać głębiej dla każdego atrybutu próby uzyskania dostępu za pomocą getattr
, więc w swoim pytaniu byłoby tak:
a = getattr(getattr(myobject, 'id', None), 'number', None)
+1, To jest chyba najlepszy pomysł, nie wiem, dlaczego nie myślałem o tym –
@Inbar Rose A co jeśli chcę obta w atrybucie atrybut w ten sam sposób, jak 'a = myobject.id.number'? – alwbtc
@alwbtc Dodano do mojej odpowiedzi. –