2010-10-16 2 views
6

Можно ли:Python, если заявление: Ложные против 0,0

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

без удаления ключа, если v == 0.0? (False, похоже, равен 0.0) и без удаления ключей, которые равны True.

+0

FYI это работает в Python 2.x, но в Python 3 '.items()' возвращает лениво-итерированный объект вместо списка кортежей элементов. При удалении элементов при итерации по словарю будет выполняться «RuntimeError». – AndiDog

ответ

12

Или вы можете поместить его так:

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

Nope. '0.0 in (None, '', 1.0, False) -> True, потому что линейный поиск' in' последовательностей использует '==' (что обычно является желаемым поведением, но не здесь). – delnan

+1

@delnan: да, я просто изменил его, проблема в False, потому что 0.0 == False, поэтому он должен просто поставить «is False» – mouad

+0

Fails for v = True, потому что 1.0 == True. –

11

Вы должны использовать v is False вместо v == False. То же самое относится и к вашему сравнению с None. См. PEP 8 - Style Guide for Python:

Сравнение с одиночными точками, такими как None, всегда должно выполняться с помощью «is» или «is not», а не операторов равенства.

+0

Вы абсолютно * должны * (применимы ко всем синглонам, например, «Истина» и «Нет»). – delnan

+0

@ delnan: Да, вы правы. Я изменил формулировку и добавил несколько подробностей. –

+0

... и если вы это сделаете, вы можете удалить часть 'или v == '''. –

5

Замедлить ребята с советами, из PEP 8:

Не сравнивайте булевы значения в ИСТИНА или ЛОЖЬ с помощью ==

Yes: if greeting: 

    No: if greeting == True: 

    Worse: if greeting is True: 

сравнивающие Также значение с плавающей точкой ты по не следует использовать ==, но

абс (х-другой) < verysmall

+3

'if not x' beats' if x == False', конечно.Но здесь вопрос заключается в том, как проверить, действительно ли что-то логическое значение 'False', а не что-то« ложное ». – delnan

0

Спасибо за ваши ответы. Используя советы, проблема была решена:

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

Также вы можете использовать

if not v: 
    # do something 

Это не может быть столь же точно, как if v is False, поскольку она также работает если v является 0, None, empty set и т.д.

У меня были проблемы с этой проблемой, и вышеупомянутое решение сработало для меня.

+0

Можете ли вы включить более объясненный ответ с большим количеством кода? –

Смежные вопросы