Не понятен принцип срабатывания условного оператора if

Пытаюсь проверить, какое значение из словаря cash соответствует ключу 'op':

cash = {'x': 0,
        'y': 0,
        'eq': 0,
        'op': '-'}

if cash['op'] == '+' or '+=':
    print('plus', cash)
elif cash['op'] == '-' or '-=':
    print('minus', cash)
elif cash['op'] == '*' or '*=':
    print('mult', cash)
elif cash['op'] == '/' or '/=':
    print('div', cash)
else:
    print('WTF?')

Получаю: plus {'x': 0, 'y': 0, 'eq': 0, 'op': '-'}

Несмотря на то, что значение 'op' : '-', почему-то срабатывает условие if cash['op'] == '+' or '+='. Как исправить код так, чтобы проверка значения ключа 'op' работало корректно?


Ответы (2 шт):

Автор решения: Igor
if cash['op'] in ['+', '+=']:
    print('plus', cash)
...
→ Ссылка
Автор решения: Евгений

Уже давал недавно ответ на подобный вопрос.


Дело в том, что вы неправильно реализуете сравнение.
Операция if cash['op'] == '+' or '+=': равносильна if (cash['op'] == '+') or ('+='):, и если левый операнд or изменяет своё значение, то правый - непустая строка, а булево представление непустых строк всегда истинно.

Получается операция if [True/False] or True, что всегда равно True.


Если вам нужно сравнивать значение сразу со многими, воспользуйтесь оператором вхождения in:

cash = {'x': 0,
        'y': 0,
        'eq': 0,
        'op': '-'}

if cash['op'] in ('+', '+='):
    print('plus', cash)
elif cash['op'] in ('-', '-='):
    print('minus', cash)
elif cash['op'] in ('*', '*='):
    print('mult', cash)
elif cash['op'] in ('/', '/='):
    print('div', cash)
else:
    print('WTF?')
→ Ссылка