来自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()))
Run Code Online (Sandbox Code Playgroud)
并且get():为什么它有两套()()?
BACKENDS.get(name, lambda *args, **kwargs: None)(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
该dict.update()函数可以采用可迭代的(key, value)对; 你在那里的代码传递一个生成这样的对的生成器表达式.它循环遍历sub.BACKENDS.items(),每对只选择其val.enabled()方法返回的那些True.你也可以把它表达为for循环:
for key, value in sub.BACKENDS.items():
if value.enabled():
backends[key] = value
Run Code Online (Sandbox Code Playgroud)
该dict.get()函数返回键或默认值.这里默认是匿名函数,a 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
Run Code Online (Sandbox Code Playgroud)
因此额外的()后续.get()应用于.get()返回的任何内容.
Lambdas是可以在表达式中定义的匿名函数(def functionname()一行是一个语句,必须独立存在); 因此可以在将lambdas直接存储到字典中时定义lambdas:
>>> somedict = {'howdy': lambda: 'bar'}
>>> print somedict['howdy']()
bar
Run Code Online (Sandbox Code Playgroud)