2015-06-04 53 views
2

如何在python中創建條件來檢查字典中定義的這三個關鍵字,並且它們不是False一個班輪條件,多個變量,並檢查他們都不是假?

settings = { 
    'proxy_host': '127.0.0.1', 
    'proxy_port': 8080, 
    'proxy_protocol': 'socks', 
} 

我試圖與你可以看到下面的句子。但是,這只是檢查這些關鍵字是否存在於字典settings而不會打擾什麼類型的值。

if 'proxy_host' and 'proxy_port' and 'proxy_protocol' in settings: 

我只希望我的IF爲true,如果沒有的關鍵字是錯誤地,他們都存在的鍵。

+0

你正在使用哪個版本的Python? – thefourtheye

+1

你的'if'語句是**不是**檢查那些關鍵字是字典'settings'的關鍵字。試試這個:'print('a'和'b'以及'proxy_host'的設置)''。它會打印真實的,因爲''a''爲真,''b''爲真,'設置'中的''proxy_host'爲真。 –

+0

@thefourtheye 3.4.3 – Jeflopo

回答

1

使用簡單的發電機表達和all()

if all(d.get(k) for k in keys): 

例子:

keys = ['proxy_host', 'proxy_port', 'proxy_protocol'] 
if all(settings.get(k) for k in keys): 
    print("Settings good!") 
else: 
    print("Missing setting!") 
+0

非常漂亮的一段代碼,但是當ie時,我仍然會得到''True''。 ''proxy_port''是一個空字符串(應該評估False)... – Jeflopo

+0

@JesúsFlores啊!查看更新。基本上你想「嘗試」從你的設置''dict''中獲得一堆密鑰,如果它們不存在,則默認爲''None',這會評估「錯誤」。 –

+0

你是第一個回答這個問題。所以讚美你:)正如@ PM2Ring所建議的,我使用了一個元組,因爲它們是不可變的。謝謝 !!! – Jeflopo

2
if ('proxy_host' in settings and isinstance(settings['proxy_host'], str)) 
    and ('proxy_port' in settings and isinstance(settings['proxy_port'], int)) 
    and ('proxy_protocol' in settings and isinstance(settings['proxy_protocol']), str)): 
+0

公平的呼籲,即使OP沒有詢問有關數據驗證的程度。此外,除非絕對必要,否則認爲Pythonic會避免類型檢查,因爲它會干擾[duck typing](https://docs.python.org/2/glossary.html#term-duck-typing)。 –

+0

是的,你說得對。編輯我的帖子。我認爲這是可行的,因爲操作系統有這樣一行:'但是...不用擔心什麼類型的值有' – konart

+0

哈哈,你是聰明的傢伙!真的。我認爲你的答案在技術上是最好的。但我要求提供一個班輪。也許社區應該獎勵/讚賞upvotes,我做到了;)非常感謝! – Jeflopo

1

如果你要檢查所有的鑰匙都在字典和地圖非falsey值,你可以檢查此:

if all(settings.get(x) for x in ['proxy_host','proxy_port', 'proxy_protocol']): 

dict.get(key)將返回None如果密鑰不在dict中,那麼您可以一次性檢查「是否在字典中並且值不是假的」。

+0

不錯,雖然我可能會使用一個元組而不是列表中的鍵。 –

+0

純粹的迷人,我很抱歉詹姆斯是第一個回答。我用過元組;) – Jeflopo