具有动态函数的Python字典命令?

具有动态函数的Python字典命令?,python,django,Python,Django,我是PHP中的Python/Django新手,我正试图了解这些更新示例,并从这个示例中获得: 更新:看起来它是doina jquery ish类型的更新,仅适用于已启用的项。。。我真的不明白这个函数是如何从val中产生的 backends.update(((key, val) for key, val in sub.BACKENDS.items() if val.enabled())) 并且得到:为

我是PHP中的Python/Django新手,我正试图了解这些更新示例,并从这个示例中获得:

更新:看起来它是doina jquery ish类型的更新,仅适用于已启用的项。。。我真的不明白这个函数是如何从val中产生的

            backends.update(((key, val)
                for key, val in sub.BACKENDS.items()
                    if val.enabled()))
并且得到:为什么它有两套

可以获取一组键、值对;您在那里的代码将以生成这样的对的方式传递。它在sub.BACKENDS.items上循环,并且对于每一对,只选择其val.enabled方法返回True的那些。您也可以将其表示为for循环:

for key, value in sub.BACKENDS.items():
    if value.enabled():
        backends[key] = value
get函数返回键或默认值。这里的默认值是一个匿名函数,lambda。因此,后端字典要么具有name变量中命名的键的值,要么返回lambda匿名函数。无论哪种方式,都会调用.get调用的结果本身。在Python中,函数是一级对象;你也可以把它们储存在字典里;如果您从字典中检索到一个,您仍然可以称之为:

>>> 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
可以获取一组键、值对;您在那里的代码将以生成这样的对的方式传递。它在sub.BACKENDS.items上循环,并且对于每一对,只选择其val.enabled方法返回True的那些。您也可以将其表示为for循环:

for key, value in sub.BACKENDS.items():
    if value.enabled():
        backends[key] = value
get函数返回键或默认值。这里的默认值是一个匿名函数,lambda。因此,后端字典要么具有name变量中命名的键的值,要么返回lambda匿名函数。无论哪种方式,都会调用.get调用的结果本身。在Python中,函数是一级对象;你也可以把它们储存在字典里;如果您从字典中检索到一个,您仍然可以称之为:

>>> 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

我会试着写你的例子,但要清楚一点。请参见@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)

我会试着写你的例子,但要清楚一点。请参见@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)

谢谢@Martijn,这是非常有用和详细的。有一个问题,在for循环中调用函数是否会影响内存。例如,对于key,sub.BACKENDS中的value。items:Aso,不确定这是什么不,没有。这只是一个参考。是该函数对象的表示字符串。CPython使用内存地址来帮助你检测不同的函数对象,否则它们很难分开。哇,你的反应很快@Martijn。再次感谢你的帮助。谢谢@Martijn,这是非常有用和详细的。有一个问题,在for循环中调用函数是否会影响内存。例如,对于key,sub.BACKENDS中的value。items:Aso,不确定这是什么不,没有。这只是一个参考。是该函数对象的表示字符串。CPython使用内存地址来帮助你检测不同的函数对象,否则它们很难分开。哇,你的反应很快@Martijn。再次感谢你的帮助。谢谢@Elazar。同样有助于查看填充dict的语法。谢谢@Elazar。查看此填充dict的语法也很有帮助。