返回介绍

开放问题

发布于 2024-01-29 22:24:14 字数 913 浏览 0 评论 0 收藏 0

尽管我们的范围测试工具按照计划工作,但还是有两个缺陷。首先,正如前面提到的,对最初函数的无效调用在最终的装饰器中仍然会失效。例如,如下的两个调用都会触发异常:

然而,这只是失效,而我们想要调用最初的函数,在包装器的末尾。尽管我们可以尝试模仿Python的参数匹配来避免如此,但没有太多的理由来这么做——因为无论如何调用将会在此处失效,所以我们可能也想让Python自己的参数匹配逻辑来为我们检测问题。

最后,尽管最终的版本处理位置参数、关键字参数和省略的参数,但它仍然不会对将要在接受任意多个参数的装饰器函数中使用的*args和**args显式地做任何事情。然而,我们可能不需要关心自己的目标:

·如果传递了一个额外的关键字参数,其名称将会出现在**kargs中,并且如果提交给装饰器,可以对其进行常规的测试。

·如果没有传递一个额外的关键字,其名称不会出现在**kargs或者分片的期待位置列表中,由此,不会检查它——会当做默认参数来对待它,即便它实际上是一个可选的额外参数。

·如果传递了一个额外的位置参数,没有办法在装饰器中引用它——其名称不会出现在**kargs或者分片的期待位置列表中,因此会直接忽略它。由于这样的参数没有在函数的定义中列出,所以没有办法把一个给装饰器的名称映射回到一个期待的相对位置。

换句话说,由于代码支持按照名称测试任意的关键字参数,但是不支持那些未命名的并且在函数的参数签名中没有预定位置的任意位置参数。

原则上,我们可以扩展装饰器的接口,以便在装饰的函数中支持*args,但这么做在极少情况下会有用(例如,一个特定参数名称带有一个测试,该测试应用于包装器的*pargs中超出期待参数列表的长度之外的所有参数)。既然我们已经在这个示例上耗费了很大的篇幅,所以如果你对这样的改进感兴趣,请在建议的练习中进一步研究这一主题。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文