Подходящие для Python способ проверить, если все значения в kwargs являются строку "false"


Возьмите kwargs то есть: send_members, send_companies, send_reviewers, каждая из которых содержит строку 'true' или 'false'.

Если все значения в каждом kwargs равны 'false', я хочу вывести сообщение об ошибке, например:

if (kwargs['send_members'] == 'false' and kwargs['send_companies'] == 'false' and
    kwargs['send_reviewers'] == 'false'):
        raise SomeError('at least one keyword needs to be true')
Существует ли Пифонический способ проверить, все ли значения в kwargs одинаковы, 'false'? Хотя приведенный выше пример работает, он становится очень грязным, когда у меня есть 10 kwargs.
3 3

3 ответа:

Использовать all()

if all(v == 'false' for v in kwargs.values()):
    print("All kwargs are false")
kwargs = {'send_members':'false', 'send_companies':'false', 'send_reviewers':'false'}

def v1 ():
    if set(kwargs.values()) == {'false'}:
    return 'all false!'

def v2 ():
    if not [x for x in kwargs.values() if x !='false']:
    return 'all false!'

def v3 ():
    if all(v == 'false' for v in kwargs.values()):
    return 'all false!'


In [10]: %timeit -n100 v1()
100 loops, best of 3: 1.05 µs per loop

In [11]: %timeit -n100 v2()
100 loops, best of 3: 961 ns per loop

In [12]: %timeit -n100 v3()
100 loops, best of 3: 10.3 µs per loop

Интересно, что использование all () кажется примерно в 10 раз медленнее.

Вы можете [также] использовать встроенный any() функция, которая может быть немного быстрее, чем all(), потому что она прекратит проверку, как только обнаружится сбой.

class SomeError(Exception): pass

testcases = [
    {'send_members': 'true', 'send_companies': 'false', 'send_reviewers': 'false'},
    {'send_members': 'false', 'send_companies': 'true', 'send_reviewers': 'false'},
    {'send_members': 'false', 'send_companies': 'false', 'send_reviewers': 'false'},
]

for kwargs in testcases:
    print(kwargs, end=' ')
    try:
        if any(value != 'false' for value in kwargs.values()):
            raise SomeError('at least one keyword needs to be true')
    except SomeError:
        print("At least one kwarg is not 'false'")
    else:
        print("OK, all kwargs are 'false'")