这段代码的'lambda request'和'**kwargs: {}'是什么意思,我从未见过这类用法
def validate(request, *args, **kwargs):
form_class = kwargs.pop('form_class')
extra_args_func = kwargs.pop('callback', lambda request, *args, **kwargs: {})
谢谢
a={'a':'aaa','b':'bbb'}
b=a.pop('a',lambda x,y:x)
print a
我知道 dict.pop('a') 的用法,但我不太明白 dict.pop('a', func) 中的 'func' 是有什么用的。
3 个回答
0
这段话的意思是,它从kwargs这个字典中取出一个回调函数,如果没有找到,就创建一个什么都不做的lambda函数(返回一个空的字典)。request, *args, **kwargs
这一部分大概是回调函数的“签名”。
0
这就是一个“lambda函数”。它是一种简短的方式来表示一个在代码中直接写的函数。它的样子是这样的:
lambda arg1,arg2,...: expression
这个函数相当于一个没有名字的函数,样子是这样的:
def some_nameless_function(arg1,arg2,...):
return expression
所以,你那段代码,
def validate(request, *args, **kwargs):
form_class = kwargs.pop('form_class')
extra_args_func = kwargs.pop('callback', lambda request, *args, **kwargs: {})
其实相当于一个看起来像这样的函数:
def nameless_function(request, *args, **kwargs):
return {}
def validate(request, *args, **kwargs):
form_class = kwargs.pop('form_class')
extra_args_func = kwargs.pop('callback', nameless_function)
2
这个表达式:
lambda request, *args, **kwargs: {}
创建了一个匿名函数,这个函数必须至少接收一个参数(如果给这个参数起名字的话,必须叫 request
),而且可以接收任意数量的位置参数和命名参数。调用这个函数时,它会忽略所有传入的参数,返回一个新的空字典。
这段代码:
a={'a':'aaa','b':'bbb'}
b=a.pop('a',lambda x,y:x)
print a
打印出 {'b': 'bbb'}
(这个值 a
在代码执行后依然保持不变),并把字符串 'aaa'
绑定到名字 b
上。这里 .pop
方法的第二个参数在这个情况下没有作用:它只有在第一个参数在字典中找不到时才会用到(那时 .pop
的第二个参数会作为“默认值”返回,而不会改变字典)。在这个例子中,'a'
确实在字典 a
中找到了,所以它被从字典中移除,同时对应的值,字符串 'aaa'
,被 .pop
返回(然后这个值就被绑定到名字 b
上)。