令人困惑的代码涉及lambda函数

时间:2014-11-05 17:37:11

标签: python lambda

所有,这些代码让我感到困惑:

arg_dict = conf.copy()
args = lambda var: arg_dict[var]
args.func_dict = arg_dict

我知道lambda的基础知识,但我不明白它在这里要做什么。

conf是这样的预定义词典:

conf = {
    "port":     None,
    "host":     None,
    "query":    None,
    "no_serve": None,
    "no_load":  None,
    "debug":    None,
}

1 个答案:

答案 0 :(得分:4)

代码使用lambda表达式创建一个函数对象,在调用时查找给定字典中的参数,允许您将键作为属性查找。 conf字典可能在此作为模板;它被复制,以便在为其分配更多键时不会修改原始文件。

这两行都将返回conf['debug']

的值
args.debug
args('debug')

它还会将args函数对象上的设置属性转换为为arg_dict字典中的键设置值:

args.foo = 'bar'

转换为

args_dict['foo'] = 'bar'

那是因为函数的func_dict属性构成了函数对象的属性名称空间。这通常是一个空字典,允许您在函数对象上设置任意属性。通过替换使用预定义的字典,您可以与函数体共享字典,以获得一些巧妙的技巧。

在{em>用户定义的函数下的Python datamodel中记录了func_dict属性:

  

__dict__func_dict
  支持任意函数属性的命名空间   可写

__dict__是同一属性的另一个名称。

演示:

>>> conf = {
...     "port":     None,
...     "host":     None,
...     "query":    None,
...     "no_serve": None,
...     "no_load":  None,
...     "debug":    None,
... }
>>> arg_dict = conf.copy()
>>> args = lambda var: arg_dict[var]
>>> args.func_dict = arg_dict
>>> args('debug')
>>> args.debug
>>> args.debug = 'bar'
>>> args('debug')
'bar'
>>> args.debug
'bar'