2016-03-24 34 views
1

Python komut dosyalarından birine bir sorum var. Xml config dosyalarını ana komut dosyasına almak ve dönüştürmek için kütüphaneyi tekdüze (https://github.com/stchris/untangle) kullanıyorum.Dinamik nesne adıyla python nesnelerine nasıl erişilir?

Sorun: Yapı dosyasında birden fazla kullanıcı için kullanıcı bilgileri var ve bu bilgileri bir döngüde kullanıyorum. Çok iyi çalışır, ancak xml dosyasından oluşturulan nesnelerin adı nedeniyle betiği çok çirkin yapar.

Beton Bu, dinamik kullanmak istediğim nesnenin adını değiştiremediğim (veya nasıl olduğunu bilmiyorum) anlamına gelir.

  if employee == 0: 
       if str(configobj.config.modes.employee.employee_1.name.cdata) != '': 
        display.drawtext(0,0,str(configobj.config.modes.employee.employee_1.name.cdata),"7x13B",255,255,255,True) 
        if str(configobj.config.modes.employee.employee_1.line1.cdata) != '': 
         display.drawtext(int(configobj.config.modes.employee.employee_1.line1['x']), 
             int(configobj.config.modes.employee.employee_1.line1['y']), 
        if str(configobj.config.modes.employee.employee_1.line2.cdata) != '': 
         display.drawtext(int(configobj.config.modes.employee.employee_1.line2['x']), 
             int(configobj.config.modes.employee.employee_1.line2['y']), 
        if str(configobj.config.modes.employee.employee_1.line3.cdata) != '': 
         display.drawtext(int(configobj.config.modes.employee.employee_1.line3['x']), 
             int(configobj.config.modes.employee.employee_1.line3['y'])) 
        displayimage = True 

      elif employee == 1: 
       if str(configobj.config.modes.employee.employee_2.name.cdata) != '': 
        display.drawtext(0,0,str(configobj.config.modes.employee.employee_2.name.cdata),"7x13B",255,255,255,True) 
        if str(configobj.config.modes.employee.employee_2.line1.cdata) != '': 
         display.drawtext(int(configobj.config.modes.employee.employee_2.line1['x']), 
             int(configobj.config.modes.employee.employee_2.line1['y']), 
        if str(configobj.config.modes.employee.employee_2.line2.cdata) != '': 
         display.drawtext(int(configobj.config.modes.employee.employee_2.line2['x']), 
             int(configobj.config.modes.employee.employee_2.line2['y']), 
        if str(configobj.config.modes.employee.employee_2.line3.cdata) != '': 
         display.drawtext(int(configobj.config.modes.employee.employee_2.line3['x']), 
             int(configobj.config.modes.employee.employee_2.line3['y']), 
        if str(configobj.config.modes.employee.employee_2.image.cdata) != '': 
         display.showimage(160,0,str(configobj.config.modes.employee.employee_2.image.cdata)) 
        displayimage = True 

Ve bu değişen sayı ile tekrarlanan kod bir sürü:

örnek kod aşağıda belirtilmiştir. Bunu nasıl geliştirebilirim?

+0

Something çok yanlış geliyor liste öğeleri olarak: 'configobj.config.modes.employee [0] .name.cdata' vb. – chepner

cevap

1

Kullanım getattr:

getattr(configobj.config.modes.employee, 'employee_' + str(employee + 1)).name.cdata 

Ayrıca çalışan için ayrı değişken oluşturabilirsiniz: tek tek çalışanların erişemiyorsanız sizin XML veya bu kütüphanenin tasarımında

employee = getattr(configobj.config.modes.employee, 'employee_' + str(employee + 1)) 
print(employee.name.cdata) 
print(employee.line1['x']) 
İlgili konular