2010-10-16 12 views
6

Czy jest możliwe:Python if: Fałsz vs. 0,0

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

bez usuwania klucza Jeśli V == 0.0? (Fałsz wydaje się równy 0.0) i bez usuwania kluczy, które są równe Prawdziwe.

+0

FYI to działa w Pythonie 2.x, ale w Pythonie 3, '.items()' zwraca leniwie potwierdzili obiekt zamiast listę krotek poz. Usunięcie pozycji podczas iteracji przez słownik spowoduje wtedy "RuntimeError". – AndiDog

Odpowiedz

12

Albo można umieścić go tak:

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

Nie. '0.0 in (None, '', 1.0, False)' -> True, ponieważ wyszukiwanie liniowe 'in' sekwencji używa' == '(co jest zwykle pożądanym zachowaniem, ale nie tutaj). – delnan

+1

@delnan: tak, po prostu to zmienię, problem polega na Fałsz, ponieważ 0.0 == Fałsz, więc powinien po prostu wstawić "jest fałszywy" – mouad

+0

Przegrywa dla v = Prawda, ponieważ 1.0 == Prawda. –

11

Należy użyć v is False zamiast v == False. To samo dotyczy twojego porównania z None. Zobacz PEP 8 - Style Guide for Python:

porównań singletons jak nikt nie powinien zawsze być wykonane z „jest” lub „nie”, nigdy operatorów równości.

+0

Absolutnie * należy * (dotyczy wszystkich singletonów, np. 'True' i' None'). – delnan

+0

@delnan: Tak, masz rację. Zmieniłem brzmienie i dodałem trochę więcej szczegółów. –

+0

... a jeśli to zrobisz, możesz upuścić część 'lub v == '''. –

5

Zwolnij facetów z rady, od PEP 8:

Nie porównuj wartości logicznych na true lub false przy użyciu ==

Yes: if greeting: 

    No: if greeting == True: 

    Worse: if greeting is True: 

porównując także wartość pływaka ty nie powinien używać ==, ale

abs (x-other) < verysmall

+3

'jeśli nie x' bije' jeśli x == Fałsz', na pewno.Tutaj jednak chodzi o to, jak sprawdzić, czy coś naprawdę jest wartością logiczną "Fałsz", a nie czymś "fałszerstwem". – delnan

0

Dzięki za odpowiedzi. Korzystanie sugestie, problem został rozwiązany:

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

Również można użyć

if not v: 
    # do something 

To nie może być tak precyzyjny jak if v is False gdyż prowadzi również w przypadku, gdy v jest 0, None, empty set itp.

Miałem problem z tym problemem i powyższe rozwiązanie działało dla mnie.

+0

Czy możesz dołączyć bardziej wyjaśnioną odpowiedź z większą ilością kodu? –