分类目录:《系统学习Python》总目录


现在,给定了这些限制和假设,我们可以用这一算法来考虑调用中的关键字参数以及省略的默认参数。当拦截了一个调用,我们可以做如下假设和推断:

  • N NN是传递的位置参数的个数,从*pargs元组的长度中获得。
  • *pargs中的所有N NN个位置参数,必须与从数的代码对象获取的前N NN个期待的参数匹配。依据前面列出的Python的调用顺序规则,这是正确的,因为同一调用中所有的位置参数位于所有关键字参数之前。
  • 要获取按照位置实际传递的参数名称,我们可以用传递进的*pargs位置参数元组的长度把仝部期待参数的列表分片。
  • 前个期待参数之后的任何参数,要么是按照关键字传递,要么是调用时候省略的默认参数。
  • 对于要通过装饰器验证的每个参数名:
    • 如果该名称在**kargs中,则它是按照名称传递的一一索引**kargs字典给出其传递的值。

    • 如果该名称在前N NN个期待的参数中,则它是按照位置传递的一一它在期待的列表中的相对位置给出了它在*pargs中的相对位置。

    • 否则,我们可以假设它是在调用时候省略的,并且默认的参数不需要检查。

换句话说,我们假设*pargs中前N NN个实际传递的位置参数,必须与期待的参数列表中的前N NN个参数匹配,并且假设任何其他的参数要么是按照关键字传递并位于**kargs中,要么是默认的参数。这样我们就可以略过对调用时省略的参数的测试。在这种方案下,通常位于最右边的位置参数和最左边的关键字参数之间的,或者在关键字参数之间的,或者在最右边的位置参数之后的那些省略掉的参数,装饰器将略过对它们的检查。我们可以跟踪装饰器及其测试脚本,看看这是如何在代码中实现的。

参考文献
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.