è necessario utilizzare l'involucro getattr
invece di recuperare direttamente il valore di id
.
a = getattr(myobject, 'id', None)
Questo è come dire "Vorrei recuperare l'attributo id
dall'oggetto myobject
, ma se non v'è alcun attributo id
all'interno dell'oggetto myobject
, per poi tornare None
, invece." Ma lo fa in modo efficiente.
Alcuni oggetti supportano anche la seguente forma di getattr
accesso:
a = myobject.getattr('id', None)
Secondo la richiesta 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')
semplice spiegazione:
Reduce è come un sul posto funzione ricorsiva.Ciò che fa in questo caso è iniziare con il obj
(universo) e poi ricorsivamente ottenere più profondo per ogni attributo si tenta di accedere utilizzando getattr
, così nella tua domanda sarebbe come questo:
a = getattr(getattr(myobject, 'id', None), 'number', None)
fonte
2013-02-17 16:52:59
+1, Questa è probabilmente l'idea migliore, non so perché non ci ho pensato. –
Ha, grazie, userà il tuo sostegno per una spudorata promozione di sé: P –
@Inbar Rose E se voglio farlo nell'attributo dell'attributo nello stesso modo, come 'a = mioobject.id.number'? – alwbtc