问下大佬们一个关于**kwargs 的小问题

2019-09-20 18:52:59 +08:00
 9ohnnyR
def log(*args, **kwargs):
print('[Log]', args)
print('[Log]', *args)
print('[Log]', kwargs)
print('[Log]', **kwargs)

if __name__ == '__main__':
log(1, 2, host='haha', port=3000)
----------------------------------------------------------------------------------------------------------------------
前三行都是能正常输出的
输出结果如下:
[Log] (1, 2)
[Log] 1 2
[Log] {'port': 3000, 'host': 'haha'}

但是第四行会报错

报错信息如下:
Traceback (most recent call last):
File "/Users/liulang/PycharmProjects/class2/server.py", line 31, in <module>
log(1, 2, host='haha', port=3000)
File "/Users/liulang/PycharmProjects/class2/server.py", line 28, in log
print('[Log]', **kwargs)
TypeError: 'port' is an invalid keyword argument for this function
2295 次点击
所在节点    Python
7 条回复
inhzus
2019-09-20 18:58:49 +08:00
这个问题算是 Python 的基础吧,v 站之前也有过类似问题,Google 关键词 Python dict unpacking and packing。希望可以善用搜索引擎
9ohnnyR
2019-09-20 19:04:20 +08:00
@inhzus 好的 谢谢
ysc3839
2019-09-20 19:13:48 +08:00
因为 print 不接受 keyword args。
ysc3839
2019-09-20 19:15:47 +08:00
@ysc3839 更正一下:不是不接受 keyword args,是不接受 port 这个 keyword。
https://docs.python.org/3/library/functions.html#print
hushao
2019-09-20 19:16:05 +08:00
理解**kwargs 在做什么就知道了
littlespider89
2019-09-20 19:18:31 +08:00
第四行相当于 print('[LOG]', port=3000, host='haha')
你看看 print 的函数签名,就知道了
oahebky
2019-09-21 17:30:09 +08:00
t = ("foo", "bar")
print("*args: ", *t)
相当于 print("*args: ", "foo", "bar")

kw = {"foo": "bar"}
print("**kw: ", **kw)
相当于 print("**kw: ", foo="bar")
也就是说 **kw 作为参数:
1. 并非是:func("key1=value1", "key2=value2")
2. 并非是:func(key1, value1, key2, value2)

这也是合理,因为它本来就应该是这样子。

------

所以有些代码可能这么写:
dict_ = {
"key1": "value1",
"key2": "value2",
}

class A:
def __init__(key1, key2):
...略...

a = A(**dict_)

======
(因为 V2EX 评论显示问题,所以上面代码的空格无法显示。)

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

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

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

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

© 2021 V2EX