浅谈Python中字典的打散传参

实际开发中我们常会遇到将用户提交的数据经过校验后存入数据库的操作。
假设用户使用form表单以post方式往Customer表中提交数据,后台接收到数据后往往会这样进行处理:

# 将csrf校验的键值对去除
request.POST.pop("csrfmiddlewaretoken")
# 以打散的方式将数据传入数据库的表中
Customer.objects.update_or_create(**request.POST)

我们知道,request.POST是一个QueryDict对象,实际上它是一个自定义的字典,除了修改的时候需要注意其不可变特性以外,在进行传参的时候我们可以把它当作一个字典。
而且需要注意的是,这种“打散”的方式传参要求这个字典中的所有的key必须跟数据库的表中的字段的名字一致!否则传参的时候会发生错误!

一个小demo解释字典打散传参的机理

那么问题来了:这种打散的方式的机制是什么呢?
来看下面的例子:

def func(username,password):
    global count
    print(count,username,password)
    count += 1

if __name__ == '__main__':
    count = 1
    dic = {"username":'whw','password':123}
    # 打散传参与位置参数传参
    func(**dic)
    func(username='whw',password=123)

执行的结果如下:

1 whw 123
2 whw 123

首先,我们先定义了一个函数func,里面有两个位置参数username与password,然后又定义了一个字典dic={"username":"whw","password":123},count变量作为一个计数器使用。
然后,执行func函数的时候我们采用了两种方式去传参:一种只**dic方式,也就是将dic打散;另外一种是常规的传参方式。
两种方式都正常执行,说明上述两种传参方式是等价的!
也就是说:**dic将字典打散成了一个个的key=value的形式!
另外,还需要特别注意的一点是:这种传参的方式对字典的key是有要求的,被打散的字典的key值必须与函数的位置参数的值一致,否则程序会报错!

猜你喜欢

转载自www.cnblogs.com/paulwhw/p/11328628.html
今日推荐