2010-07-19 20 views
5
import amara 
def chain_attribute_call(obj, attlist): 
    """ 
    Allows to execute chain attribute calls 
    """ 
    splitted_attrs = attlist.split(".") 
    current_dom = obj 
    for attr in splitted_attrs: 
     current_dom = getattr(current_dom, attr) 
    return current_dom 

doc = amara.parse("sample.xml") 
print chain_attribute_call(doc, "X.Y.Z") 

En oder para ejecutar llamadas de atributo de cadena para un objeto como una cadena, tuve que desarrollar el fragmento torpe arriba. Tengo curiosidad de saber si habría una solución más inteligente/eficiente para esto.Python Cadena getattr como una cadena

Respuesta

9

Sólo se copia de Useful code which uses reduce() in Python:

from functools import reduce 
reduce(getattr, "X.Y.Z".split('.'), doc) 
+0

Gran snipplet! Lamentablemente, mi servidor es Debian Lenny y se ejecuta con Python 2.5, mientras que reduce requiere 2.6 :( – Hellnar

+1

@hellinar: 'reduce' es una función incorporada en python2.5 – SilentGhost

+1

@Hellnar: Python 2.5 tiene' reducir', excepto que es una construcción -en función en lugar de estar en 'functools'. – kennytm

18

También es posible usar:

from operator import attrgetter 
attrgetter('x.y.z')(doc)