2015-12-06 40 views
4

是否可以簡化kwargs選項的布爾檢查?在kwargs和kwargs中簡化`if'foo'['foo']爲True:`

例如,在foo我要查很多的選擇:

def foo(*args, **kwargs): 
    if 'foo' in kwargs and kwargs['foo'] is True: 
     do_something() 
    if 'bar' in kwargs and kwargs['bar'] is True: 
     do_something_else() 
    ... 

一個可能workaroud是通過增加更多的複雜性隱藏某些複雜...

def parse_kwargs(kwords, **kwargs): 
    keywords = {} 
    for kw in kwords: 
     keywords[kw] = True if kw in kwargs and kwargs['kw'] is True else False 
    return keywords 

然後在我的主要功能:

def foo(*args, **kwargs): 
    kw = parse_kwargs(**kwargs) 

    if kw['foo']: 
     do_something() 
    if kw['bar']: 
     do_something_else() 
    ... 

我想知道如果我可以使用更簡單的m ethod少樣板...

+1

'如果kwargs.get( '富'):' – khelwood

+1

http://stackoverflow.com/questions/12399803/how-to-check-if-a-key-in-kwargs-exists –

回答

6

dict.get是有用的,以避免KeyError當訪問一個不存在的鍵:

if kwargs.get('foo'): 

或者

if kwargs.get('foo', False): 
+1

大,這就是我正在尋找的:) – nowox

+2

'.get()'返回的默認值是'None',所以'kwargs.get('foo',False)'在這種情況下確實不需要。 –

+1

但是,請大家幫忙,寫下'if kwargs.get('foo'):' – alexis

1

這個怎麼樣?

def foo(*args, **kwargs): 
    keywords = {'foo': do_foo_something, 
       'bar': do_bar_something, 
       'frug': do_frug_someting, 
       ...} 
    for k in keywords: 
     if kwargs.get(k, False): 
     keywords[k]() 

def do_foo_something(): 
    do stuff 

def do_bar_something(): 
    do stuff 

def do_frug_something(): 
    do stuff 
+0

嗯......有用的技術來簡化代碼。幹得不錯! :D – Zizouz212

+0

對於這個問題,這是一個很好的答案,但我實際上正在試圖避免將'KeyError'作爲[shx2](http://stackoverflow.com/users/2096752/shx2)找到它。 – nowox

+0

Gotcha。我在看到他的回答後,將shx2的get()建議加入了。我以爲你是在通過某種方式來管理所有'做點事情'。 –

1

以檢查可能沒有設置值的方法是用get(),這對丟失的鑰匙,而不是拋出一個錯誤返回None。但你也應該改變is True部分:

  1. 一個布爾值,測試出來的真正的,如果你只是檢查本身的價值;所以它的簡單(和適當的蟒蛇風格)寫

    如果kwargs.get(「富」): ...

  2. is True不僅是多餘的,但不正確的:is不檢查值相等,但爲了身份。 python中的任何非零值都計爲true,但例如1 is True作爲錯誤出現! 1 == True檢查「真實性」,這是你應該使用(如果有的話)。即使這個函數只會收到真正的布爾值,但將代碼加載到對它會看到的內容的不必要的強烈假設上是一個壞主意。

+0

如果您明確尋找「真」,該怎麼辦? '如果kwargs.get('foo')'與'如果kwargs.get('foo')爲True'不一樣「。說這是錯誤的,就像說'如果some_val是None'是錯誤的 –

+0

在這種情況下,'是True'的確是合適的。你認爲在這種情況下的可能性是什麼? – alexis

+0

重新編輯您的評論:我稱它不正確,因爲它不一樣。 – alexis