2016-12-22 4 views
0

У меня довольно длинный список условий, которые могут быть истинными, чтобы удовлетворить конкретную инструкцию if. Я пытаюсь отлаживать и выяснять, какое условие было выполнено, поскольку это не должно быть, есть ли лучший способ, чем тестирование каждого условия в отдельности? что-то вроде:Отладка python, определить, какое условие было правдой

if (xpr1 or xpr2 or xpr3 .......): 
    print "xpr# was true" 

ИЛИ лучше.

 print "all variables" from true condition 

Python 2,7

+0

Что относительно ['any (xpr1, xpr2, ...)'] (https://docs.python.org/3.5/library/functions.html#any)? для отладки вы можете использовать '[bool (x) для x in (xp1, xpr2, ...)]'. –

+0

@hiro all() возвращает True, если все элементы True, если (...) из UserZer0 возвращает True, если хотя бы один элемент имеет значение True. – Humbalan

+0

@ Хумбалан да, только что заметил и исправил. –

ответ

2
>>> a = False 
>>> b = True 
>>> c = False 
>>> print [name for name in ['a', 'b', 'c'] if locals()[name]] 
['b'] 
+1

Альтернативно, если печатать кавычки и запятые вызывает раздражение для многих переменных, вы можете вместо этого просто написать '' a b c'.split() '. –

+0

@AlexHall ваш комментарий значительно улучшает полезность этого ответа! Не подумал бы об этом! – UserZer0

+0

Или, поскольку они являются одиночными символьными именами: 'list ('abc')'. – Rob

2

Существует на самом деле не лучше, чем способ тестирования каждого состояния индивидуально, но вы можете сделать это компактно в списке понимания, например:

conditions = (xpr0, xpr1, xpr2, xpr3) 
print [i for i, xpr in enumerate(conditions) if xpr] 

напечатает список индексов выражений, которые являются истинными. Однако это не приведет к короткому замыканию, которое вы получите с помощью or.

Конечно, вы можете принудительно короткого замыкания с помощью «традиционных» for цикл с break заявление, например:

for i, xpr in enumerate(conditions): 
    if xpr: 
     print i, xpr 
     break 

хотя это не точно так же, как короткое замыкание выполняется по

if xpr0 or xpr1 or xpr2 or xpr3: 

потому что мы уже предварительно вычислены все выражения в conditions списке.


Как Хиро герой упоминает в комментариях, вы можете проверить, если любой из этих выражений справедливы с

any(conditions) 

и будет короткого замыкания точно так же, как традиционные for петли код выше.

FWIW, как правило, использует выражение any и all вместо выражения списка comp, поскольку это позволяет избежать ненужной оценки выражений после достижения точки короткого замыкания, но здесь это не применимо.

Смежные вопросы