Как я могу упростить многовариантный для цикла с параллельными переменными? - PullRequest
0 голосов
/ 29 марта 2012

Можно ли избежать повторения каждого имени атрибута? Могу ли я заменить этот повторяющийся 2D-список?

test_list = (('PointValue',  s_pt.PointValue,  m_pt.PointValue),
             ('PointType',   s_pt.PointType,   m_pt.PointType),
             ('Group',       s_pt.Group,       m_pt.Group),
             ('TimeStamp',   s_pt.TimeStamp,   m_pt.TimeStamp),
             ('Tag',         s_pt.Tag,         m_pt.Tag),
             ('PointTime',   s_pt.PointTime,   m_pt.PointTime),
             ('PointNumber', s_pt.PointNumber, m_pt.PointNumber),
             ('Quality',     s_pt.Quality,     m_pt.Quality))
for var, s_var, m_var in test_list:
  REPORT += 'Slave %s = %s ::: Master %s = %s\n' % (var, s_var, var, m_var)

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Вот один из вариантов:

test_list = ('PointValue', 'PointType', 'Group', 'TimeStamp', 
             'Tag', 'PointTime', 'PointNumber', 'Quality')

format_string = 'Slave %s = %s ::: Master %s = %s\n'
for var in test_list:
    REPORT += format_string % (var, getattr(s_pt, var), var, getattr(m_pt, var))
1 голос
/ 29 марта 2012

Используйте getattr.Как в getattr(s_pt, 'PointValue') вместо s_pt.PointValue.

Тогда ваш цикл будет:

test_list = ['PointValue', 'PointType', 'Group', 'TimeStamp', 
         'Tag', 'PointTime', 'PointNumber', 'Quality']

for var in test_list:
    REPORT += 'Slave {0} = {1} ::: Master {0} = {2}\n'.format(
        var, getattr(s_pt, var), getattr(m_pt, var))
...