Подходящие для 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 ответа:
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'")