Python中可直接用列表传参,为何还需要*args与**kwargs?
类初始化两种传参写法的合理性说明
两种写法均具备实用性,可根据场景选择
两种写法都是合法可运行的,适用场景不同:
- 不使用*args的版本
代码如下:
这种写法适合courses参数本身就是以集合形式存在的场景,逻辑更清晰,也方便你在class Student: def __init__(self, name, courses): self.name = name self.courses = courses Peter = Student('Peter', ['Math', 'English'])__init__中对courses做整体的类型校验、去重、过滤等预处理,调用方也能明确感知到第二个参数需要传入聚合后的课程集合。 - 使用*args的版本
代码如下:
这种写法适合课程数量不固定、调用时参数是零散获取的场景,不需要调用方手动把课程封装成列表,调用语法更简洁。如果要传入已经封装好的列表,只需要调用时做解包即可:class Student: def __init__(self, name, *courses): self.name = name self.courses = courses Peter = Student('Peter', 'Math', 'English')Peter = Student('Peter', *['Math', 'English'])。
不存在必须使用*args的绝对场景
本质上args只是Python提供的语法糖,所有用args实现的逻辑都可以通过传入集合参数的方式实现,不存在前者能正常运行、后者必然报错的场景。但部分场景下用*args会更符合编码习惯、减少冗余代码:
- 方法需要接收任意数量的同类型位置参数,且调用方传入零散参数的频率更高,比如Python内置的
print()、max()等函数,都是用*args接收参数,避免每次调用都要手动封装列表,更符合使用者的直觉。 - 做装饰器开发时,用
*args, **kwargs可以兼容任意原函数的参数列表,不需要提前知道原函数的参数结构,这种场景下用*args会大幅简化代码。
内容的提问来源于stack exchange,提问作者Henry Chan
相关产品推荐
相关产品推荐

