1

来自 PHP 的 Python/Django 新手,我试图围绕此示例中的这些 update() 和 get() 示例展开思考:

https://pypi.python.org/pypi/django-social-auth/0.3.0

update():看起来它是 doina jquery-ish 类型的更新,仅适用于已启用()的项目......我真的不明白该功能是如何从 val 中出来的。

            backends.update(((key, val)
                for key, val in sub.BACKENDS.items()
                    if val.enabled()))

get():为什么它有两套()()

BACKENDS.get(name, lambda *args, **kwargs: None)(*args, **kwargs)
4

2 回答 2

5

dict.update()函数可以采用一(key, value)对可迭代的对象;您那里的代码传入生成此类对的生成器表达式。它循环并为每一对只选择方法返回sub.BACKENDS.items()的那些。您也可以将其表示为 for 循环:val.enabled()True

for key, value in sub.BACKENDS.items():
    if value.enabled():
        backends[key] = value

dict.get()函数返回键或默认值。这里默认是一个匿名函数,一个lambda. 因此BACKEND字典要么具有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

因此,额外的()after.get()应用于.get()返回的任何内容。

Lambda 是可以在表达式中定义的匿名函数(def functionname()一行是一个语句,必须独立存在);因此,可以在将 lambdas 直接存储到字典中时对其进行定义:

>>> somedict = {'howdy': lambda: 'bar'}
>>> print somedict['howdy']()
bar
于 2013-06-05T00:16:50.190 回答
0

我会尝试写你的例子,但更清楚一点。请参阅@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)
于 2013-06-05T00:23:18.413 回答