2015-11-17 3 views
0

У меня есть объект с большим количеством переменных, которые все возвращают Pass, Fail или NA. Я пытаюсь суммировать результаты, чтобы вернуть общее количество проходов и т. Д.Итерации через объектные переменные эффективно с Python

Я хотел бы сделать что-то вроде следующего.

list_of_checks = [check1, check2, check3] 
    for check in list_of_checks: 
     for a_object in list_of_objects: 
      if a_object.check == "Pass" 
       pass_counter += 1 
      elif a_object.check == "Fail" 
       fail_counter += 1 

Это не работает. Я получаю трассировку, потому что у объекта a_object нет атрибута «check»

Возможно ли это, или я должен переборщить его?

+0

опубликовать полный код. –

+0

Переменная _check_ необязательна? Вы можете использовать _getattr_ или блок try/except. – tdelaney

+0

Кажется, что не все объекты имеют переменную проверки. Поскольку у вас есть опция, чтобы она была NA, почему бы не инициализировать каждый объект с NA, а затем изменить его на Pass/Fail, когда вам нужно? – Antimony

ответ

0

Вы не можете использовать переменную check для доступа к объектам объекта таким образом. Вы могли бы, однако сделать что-то подобное:

if getattr(a_object, check) == "Pass": 

Эти две строки эквивалентны:

if getattr(a_object, "check1") == "Pass": 

if a_object.check1 == "Pass": 
+0

Мне было бы интересно узнать, почему этот ответ заслуживает понижения? Ну хорошо ... – Galax

+1

Я бы тоже. Этот ответ сработал. Благодаря! – PerryDaPlatypus

+0

@ user3641109 Возможно, потому что использование 'getattr' обычно рассматривается как нечто вроде грязного. Не потому, что его плохая функция, а потому, что обычно ее присутствие является запахом кода. Но он * работает *. – zxq9

0

Вы можете использовать GetAttr для проверки атрибутов Programatically, но не может ссылаться на функцию, которая является членом инстанции используя общую метку, связанную с членами класса. Использование GetAttr требует, чтобы имя членов вы хотите сослаться быть заданы как строки:

list_of_checks = ['check1', 'check2', 'check3'] 
for check in list_of_checks: 
    for a_object in list_of_objects: 
     maybe = getattr(a_object, check) 
     if maybe == "Pass": 
      pass_counter += 1 
     elif maybe == "Fail": 
      fail_counter += 1 

Если не каждый объект имеет «Check1» или любые другие, то вы получите исключение, которые могут быть пойманы с

try: 
    if getattr(obj, check) == "Pass" 
     # and so on... 
except AttributeError: 
    # Do whatever 

НО

Вообще говоря, всякий раз, когда я вижу ситуацию, когда я думаю, что мне нужно условный внутри в виде try...except п I am обычно, глядя на ситуацию, когда я только что создал проблему X-Y для себя, и нужно еще раз подумать в структуре кода, чтобы найти способ не нуждаться в этих проверках в первую очередь.

Например, почему вы не просите свои объекты, если они прошли или не удалось, и если у них есть, они уведомляют объекты-хранители. Или что-то вдоль этих линий.

+0

Отличная точка зрения на подход. Благодарю. – PerryDaPlatypus