分类目录:《系统学习Python》总目录
考虑被装饰函数的期待参数名的集合,该解决方案依赖于Python对于参数传递顺序所施加的两条限制(在Python2.X和Python3.X的当前发行版本中都仍然成立):
- 在调用时,所有的位置参数出现在所有关键字参数之前。
- 在
def
中,所有的非默认参数出现在所有的默认参数之前。
也就是说,在一个调用中,一个非关键字参数通常不会跟在一个关键字参数后面,并且在定义中,一个非默认参数不会跟在一个默认参数后面。在调用和def
这两种位置中,所有的name=value
语法必须出现在任何简单的name
之后。正如我们也了解过的,Python按从左至右的顺序把按位置传递的参数值与函数头中的参数名相匹配,这样这些值就总能够匹配头部中最左边的那些名称。而关键字通过名称匹配,并且一个给定的参数只能够接收一个值。
为了简化任务,我们也可以假设一个调用一般是有效的一一一也就是说,所有的参数要么接收值(按照名称或位置),要么将有意省略而选取默认值。这种假设不一定成立,因为当包装器的逻辑测试有效性的时候,数还没有被真正调用一一而由于不正确的参数传递,随后包装器层调用函数的时候仍然可能失效。只要这不会引发包装器过分糟糕地失效,我们就可以巧妙处理调用的有效性。这是有帮助的,因为在调用发生之前验证它,将会要求我们完全仿真Python的参数匹配算法一一一再一次说明,这对我们的工具来说是一个过于复杂的过程。
参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.