关于可变参数和关键字参数的疑问

2016-09-01 22:51:24 +08:00
 Newyorkcity

请看这段代码有下划红笔的那个地方
在这里**kw 应该和 warpper()中的**kw 是相等的吧?
既然**kw 可以在 res = func(*args, **kw)这种形式下被接收,那么为什么 print(**kw)是错误呢?
print(**kw)时报错如下:
TypeError:'key' is not an invalid keyword argument for this function
(这个错误我去查了,提出问题的人写的代码已经超出了我学过的内容,而且基本都是英文网站..)
然后 print(kw)的结果是
{'key' : 'value'}
这个想法倒是挺符合我的预计的.

额最后强调一下问题
既然**kw 可以在 res = func(*args, **kw)这种形式下被接收,那么为什么 print(**kw)是错误呢?
谢谢!
===========以上是问题主要部分,以下是自己在学习的时候的胡思乱想....求指点对不对====
一开始我对*args 这个东西也感到很奇怪,因为
def func(),这个时候用可变参数和关键字参数是我所学的,可是在函数调用的时候怎么也可以输入这种东西呢?
然后就试验了一下
print(args)和 print(*args) 并且 print(type(args))
然后发现 args 是一个 tuple 类型,而*args 就是把 tuple 中的每个元素取出来后列在那里
这样一想我就还好接受一点,相当于
def wrapper(*args):
当调用这个函数时,传入的所有可变参数都整合在一起作为一个 tuple 并且 arg = tuple,而 *args 就相当于打开这个 tuple 取出其中的每一个元素...
所以我觉得**kw 应该也有同样的性质,然而遭到了挫败...
所以我就不是很明白,我的猜想到底对不对....

再次感谢...
1963 次点击
所在节点    Python
5 条回复
knightdf
2016-09-01 23:07:26 +08:00
res = func(*args, **kw)这表明的是可以接受可变数量的参数 args 和可变数量的关键字参数 kw , print(**kw)中的**kw 是解包,是把 dict kw 中的 key/value 解开了,就变成了 print(key=value), 这和 print({'key':value})明显是不一样的
just1
2016-09-01 23:13:31 +08:00
楼上正解
Newyorkcity
2016-09-02 08:53:31 +08:00
@knightdf 也就是说对于 print(函数),它是不支持关键字参数的?相等于
def print(*args):
在定义中就没有给出关键字变量的位置?所以无法处理 dict 的解包?
谢谢
petelin
2016-09-02 10:02:24 +08:00
解包任何时候都是可以处理的,我说的是解这个操作,你可以把它看出预处理一样的东西,所以问题在于,你包里面的 k=V ,在 print 函数里找不到对应
knightdf
2016-09-02 12:56:17 +08:00
@Newyorkcity python3 的 print 才是个函数,是有关键字参数的,你看可以看看文档, python2 默认的 print 是一个语句,没有参数一说

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/303334

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX