2010-10-16 17 views
6

¿Es posible:Python sentencia if: Falso vs. 0.0

for k,v in kwargs.items() 
    if v == None or v == '' or v == 1.0 or v == False: 
     del kwargs[k] 

sin borrar la clave si v == 0.0? (False parece ser igual a 0.0), y sin eliminar las claves que son iguales a True.

+0

FYI esto funciona en Python 2.x, pero en Python 3, '.items()' devuelve un objeto iterado de forma perezosa en lugar de una lista de tuplas de elementos. Al eliminar elementos al iterar sobre el diccionario, se generará un 'RuntimeError'. – AndiDog

Respuesta

12

O puede ponerlo de esta manera:

if v in (None, '', 1.0) or v is False: 
+0

No. '0.0 in (None, '', 1.0, False)' -> Verdadero porque la búsqueda lineal 'in' de secuencias usa' == '(que generalmente es el comportamiento deseado, pero no aquí). – delnan

+1

@delnan: sí, solo lo cambio, el problema es con False, porque 0.0 == False, por lo que debería simplemente poner "is False" – mouad

+0

Falla para v = Verdadero, porque 1.0 == Verdadero. –

11

Debe usar v is False en lugar de v == False. Lo mismo aplica para su comparación al None. Ver PEP 8 - Style Guide for Python:

Las comparaciones con singletons como None siempre se deben hacer con 'is' o 'is not', nunca con los operadores de igualdad.

+0

Usted absolutamente * debería * (se aplica a todos los singletons, por ejemplo, 'True' y' None'). – delnan

+0

@delnan: Sí, tienes razón. Cambié la redacción y agregué más detalles. –

+0

... y si lo hace, puede descartar la parte 'o v == '''. –

5

Reduzca la velocidad chicos con su consejo, de PEP 8:

No se puede comparar valores booleanos a Verdadero o Falso usando ==

Yes: if greeting: 

    No: if greeting == True: 

    Worse: if greeting is True: 

también comparando valor flotante que no debería usar == pero

abs (x-otro) < verysmall

+3

'if not x' beats' if x == False', seguro.Pero aquí, la pregunta es cómo comprobar si algo realmente es el valor booleano 'False', no algo" falsy ". – delnan

0

Gracias por sus respuestas. El uso de las sugerencias, el problema se resolvió:

kwargs = {'None': None, 'empty': '', 'False': False, 'float': 1.0, 'True': True}  
for k,v in kwargs.items(): 
    if v in (None, '', 1.0) and v is not True: 
     del kwargs[k] 
    if v is False: 
     del kwargs[k] 

kwargs 
{'True': True} 

->

kwargs = {'None': None, 'empty': '', 'False': False, 'float': 0.0, 'True': True}  
for k,v in kwargs.items(): 
    if v in (None, '', 1.0) and v is not True: 
     del kwargs[k] 
    if v is False: 
     del kwargs[k] 

kwargs 
{'True': True, 'float': 0.0} 
1

También se podrían utilizar

if not v: 
    # do something 

Esto puede no ser tan preciso como if v is False ya que también funciona para si v es 0, None, empty set etc.

Tuve problemas con este problema y la solución anterior funcionó para mí.

+0

¿Puedes incluir una respuesta más explicada con más código? –