这段代码的'lambda request'和'**kwargs: {}'是什么意思,我从未见过这类用法

0 投票
3 回答
790 浏览
提问于 2025-04-15 17:23
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 上)。

撰写回答