3 回答

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
該dict.update()函數(shù)可以(key, value)成對(duì)迭代。您那里的代碼在生成此類的生成器表達(dá)式中傳遞。它循環(huán)遍歷,sub.BACKENDS.items()并且對(duì)于每對(duì)僅選擇其val.enabled()方法返回的對(duì)象True。您也可以將其表示為for循環(huán):
for key, value in sub.BACKENDS.items():
if value.enabled():
backends[key] = value
該dict.get()函數(shù)返回鍵或默認(rèn)值。這里的默認(rèn)值是一個(gè)匿名函數(shù)a lambda。因此,BACKEND詞典要么在name變量中具有命名鍵的值,要么返回lambda匿名函數(shù)。無論哪種方式,.get()調(diào)用結(jié)果本身都會(huì)被調(diào)用。在Python中,函數(shù)是一流的對(duì)象。您也可以將它們存儲(chǔ)在字典中;如果您從字典中檢索一個(gè),您仍然可以調(diào)用它:
>>> def foo(): print 'bar'
...
>>> somedict = {'howdy': foo}
>>> somedict['howdy']()
bar
>>> somedict['howdy']
<function foo at 0x109ab9320>
>>> somedict.get('non-existent', 'not found')
'not found'
>>> somedict.get('howdy', 'not found')
<function foo at 0x109ab9320>
>>> somedict.get('howdy', 'not found')()
bar
因此,將多余的()時(shí)間.get()應(yīng)用于.get()返回的所有內(nèi)容。
Lambda是可以在表達(dá)式中定義的匿名函數(shù)(def functionname()一行是語句,必須獨(dú)立存在);因此,可以在將lambdas直接存儲(chǔ)到字典中的同時(shí)對(duì)其進(jìn)行定義:
>>> somedict = {'howdy': lambda: 'bar'}
>>> print somedict['howdy']()
bar

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
我將嘗試編寫您的示例,但要更加清楚。參見@Martijn Pieters的答案中的解釋。
new_items = [(key, func) for key, func in sub.BACKENDS.items() if func.enabled()]
backends.update(new_items)
def do_nothing(*args, **kwargs):
pass
func = BACKENDS.get(name, do_nothing)
func(*args, **kwargs)
添加回答
舉報(bào)