2016-03-24 40 views
1

私は私のpythonスクリプトの1つに質問があります。私はライブラリのアンアンカー(https://github.com/stchris/untangle)を使用して、XML設定ファイルをインポートしてメインスクリプトに変換しています。動的オブジェクト名でpythonオブジェクトにアクセスするには?

問題:複数のユーザーの設定ファイルにユーザー情報があり、この情報をループで使用しています。それは非常にうまく動作しますが、xmlファイルから生成されたオブジェクトの名前のためにスクリプトが非常に醜いものになります。

具体的には、これは私が動的に使用したいオブジェクトの名前を変更できない(またはわかりません)ことを意味します。

のコード例は以下の通りです:

  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 

そして、これは変化の数で繰り返しコードがたくさんあります。これをどのように改善できますか?

+0

何かが非常に間違っているようですリスト要素として: 'configobj.config.modes.employee [0] .name.cdata'など – chepner

答えて

1

使用getattr

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

ます。また、従業員のために別の変数を作成することができます:あなたは、個々の従業員にアクセスすることができない場合は、あなたのXMLの設計やそのライブラリ内

employee = getattr(configobj.config.modes.employee, 'employee_' + str(employee + 1)) 
print(employee.name.cdata) 
print(employee.line1['x']) 
関連する問題