Python:__init__方法中/符号含义解析(含*args、**kwargs与OrderedDict示例)
嗨,作为Python新手碰到这种语法细节确实容易懵,我来给你把这两个问题拆解清楚~
1. 方法签名中
/的含义 这个/是Python 3.8引入的仅限位置参数标记,它的作用是明确划分参数的传递方式:在/之前的参数,只能通过位置传递,绝对不能用关键字参数的形式来指定。
回到你贴的代码里,maxsize=128放在/的前面,意味着调用这个LRU类的时候,maxsize只能像LRU(64)这样传值,要是写成LRU(maxsize=64)就会报错——Python会告诉你这个参数不能用关键字传递。
而/后面的参数(也就是这里的*args和**kwds),就遵循Python常规的参数传递规则了。
2. 带
*args和**kwds的默认参数说明 先给你理清这两个可变参数的基础作用:
*args:用来接收任意数量的额外位置参数,Python会把这些参数打包成一个元组,方便在方法内部使用。**kwds:用来接收任意数量的额外关键字参数,Python会把这些参数打包成一个字典。
在这个LRU类的__init__里,maxsize有默认值128,同时允许传入额外的位置或关键字参数,然后通过super().__init__(*args, **kwds)把这些参数原封不动地传给父类OrderedDict的构造方法,相当于让父类去处理这些额外参数。
举个实际调用的例子:
# 自定义maxsize,同时传入一组键值对位置参数和一个关键字参数 cache = LRU(64, ('a', 1), ('b', 2), c=3)
这时候:
maxsize被赋值为64(通过位置传递)*args会接收('a',1), ('b',2),打包成元组(('a',1), ('b',2))**kwds会接收c=3,打包成字典{'c':3}
这些参数都会传给OrderedDict的构造方法,最终生成一个包含a:1、b:2、c:3的有序字典,同时缓存的最大容量是64。
另外要注意参数的顺序规则:在Python的方法签名里,参数必须按照「仅限位置参数(/前)→ 位置/关键字参数 → *args → 仅限关键字参数 → **kwds」的顺序来定义,你贴的代码完全符合这个规则,所以是合法的。
内容的提问来源于stack exchange,提问作者Abhijit Sarkar
相关产品推荐
相关产品推荐

