为了账号安全,请及时绑定邮箱和手机立即绑定

具有动态功能的Python字典命令?

具有动态功能的Python字典命令?

蓝山帝景 2021-03-19 14:10:10
PHP / Python的新手,正在尝试围绕以下示例中的update()和get()这些示例:https://pypi.python.org/pypi/django-social-auth/0.3.0update():看起来这只是doina jquery-ish类型的更新,仅适用于enabled()...的项目……我真的不知道该功能如何从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)
查看完整描述

3 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

该dict.update()函数可以(key, value)成对迭代。您那里的代码在生成此类的生成器表达式中传递。它循环遍历,sub.BACKENDS.items()并且对于每对仅选择其val.enabled()方法返回的对象True。您也可以将其表示为for循环:


for key, value in sub.BACKENDS.items():

    if value.enabled():

        backends[key] = value

该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

因此,将多余的()时间.get()应用于.get()返回的所有内容。


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


>>> somedict = {'howdy': lambda: 'bar'}

>>> print somedict['howdy']()

bar


查看完整回答
反对 回复 2021-03-30
?
皈依舞

TA贡献1851条经验 获得超3个赞

我将尝试编写您的示例,但要更加清楚。参见@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)



查看完整回答
反对 回复 2021-03-30
  • 3 回答
  • 0 关注
  • 193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信