2010-07-19 19 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") 

Bir öznitelik için zincir öznitelik çağrıları yürütmek üzere bir dize olarak, yukarıdaki sakız snippet'ini geliştirmek zorundaydım. Bunun daha akıllı/verimli bir çözümü olup olmayacağını merak ediyorum.Python Zincir dizgesi bir dizgi olarak

cevap

9

Sadece Useful code which uses reduce() in Python kopyalama:

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

Büyük snipplet! Ne yazık ki sunucum debian lenny ve python 2.5 ile çalışırken 2.6 gerektirir gerektirir :( – Hellnar

+1

@hellinar: 'azaltma 'python2.5 içinde yerleşik bir işlevdir. – SilentGhost

+1

@Hellnar: Python 2.5' küçült 'vardır, hariç – kennytm

18

da kullanabilirsiniz:

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