Tome kwargs es decir: send_members, send_companies, send_reviewers, cada uno de los cuales contiene la cadena 'true' o 'false'.

Si todos los valores en cada kwargs son 'false', quiero mostrar un mensaje de error, por ejemplo:

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')

¿Hay alguna forma pitónica de verificar si todos los valores en kwargs son iguales, 'false'? Si bien el ejemplo anterior funciona, se vuelve muy complicado cuando tengo 10 kwargs.

3
Prometheus 10 may. 2016 a las 17:47

3 respuestas

La mejor respuesta

Utilice all()

if all(v == 'false' for v in kwargs.values()):
    print("All kwargs are false")
5
gr1zzly be4r 10 may. 2016 a las 15:04

Puede [también] utilizar el any() incorporado función que podría ser un poco más rápida que all() porque dejará de comprobarse tan pronto como se detecte una falla.

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'")
0
martineau 10 may. 2016 a las 15:21
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

Curiosamente, usar all () parece aproximadamente 10 veces más lento.

0
RSHAP 10 may. 2016 a las 15:21