Python中*args、*kwargs、**kwargs的类型是什么?
关于*args、*kwargs和**kwargs的类型疑问
测试1:打印args和kwargs
def test(*args, **kwargs): print(args) # Here print(kwargs) # Here nums = (1, 2, 3, 4) person = { "name": "John", "age": 27, } test(*nums, **person)
输出结果:
(1, 2, 3, 4) {'name': 'John', 'age': 27}
测试2:打印args和kwargs
def test(*args, **kwargs): print(*args) # Here print(*kwargs) # Here nums = (1, 2, 3, 4) person = { "name": "John", "age": 27, } test(*nums, **person)
输出结果:
1 2 3 4 name age
测试3:打印**kwargs
def test(*args, **kwargs): print(**kwargs) # Here nums = (1, 2, 3, 4) person = { "name": "John", "age": 27, } test(*nums, **person)
触发错误:
TypeError: 'name' 不是print()的有效关键字参数
测试4:打印args和kwargs的类型
def test(*args, **kwargs): print(type(args)) # Here print(type(kwargs)) # Here nums = (1, 2, 3, 4) person = { "name": "John", "age": 27, } test(*nums, **person)
输出结果:
<class 'tuple'> <class 'dict'>
测试5:打印*args、*kwargs、**kwargs的类型
以下三种写法都会触发相同错误:
# 写法1 def test(*args, **kwargs): print(type(*args)) # Here # 写法2 def test(*args, **kwargs): print(type(*kwargs)) # Here # 写法3 def test(*args, **kwargs): print(type(**kwargs)) # Here
错误信息:
TypeError: type() takes 1 or 3 arguments
结论:*args、*kwargs、**kwargs没有类型
*和**是Python的语法符号,本身不是变量,自然没有类型:
- 函数定义时的
*args是用来把所有位置参数收集到名为args的元组里;**kwargs是把所有关键字参数收集到名为kwargs的字典里。 - 调用函数时的
*nums是把可迭代对象nums解包成多个位置参数;**person是把字典person解包成多个关键字参数。 - 当你写
print(*args),本质是把args这个元组解包成多个位置参数传给print,不是*args有类型,而是args本身是元组。 print(**kwargs)报错是因为把kwargs字典解包成name="John"、age=27这类关键字参数传给print,但print不接受这些关键字参数。type(*args)报错是因为解包args后传给type多个参数,而type只接受1或3个参数;同理type(*kwargs)会把字典的键作为多个位置参数传给type,参数数量不符合要求;type(**kwargs)则是传了无效的关键字参数给type,所以都会报错。
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

