返回介绍

针对位置参数的一个基本范围测试装饰器

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

让我们从基本的范围测试实现开始。为了简化,我们将从编写一个只对位置参数有效的装饰器开始,并且假设它们在每次调用中总是出现在相同的位置。它们不能根据关键字名称传递,并且我们在调用中不支持额外的**args关键字,因为这可能会使装饰器中的位置声明无效。在名为devtools.py的文件中编写如下代码:

还是老样子,这段代码主要是修改了我们前面介绍的编码模式:我们使用装饰器参数,嵌套作用域以进行状态保持,等等。

我们还使用了嵌套的def语句以确保这对简单函数和方法都有效,就像在前面所学习到的。当用于类方法的时候,onCall在*args中的第一项接受主体类的实例,并且将其传递给最初的方法函数中的self;在这个例子中,范围测试中的参数数目从1开始,而不是从0开始。

还要注意到,这段代码使用了__debug__内置变量——Python将其设置为True,除非它将以-O优化命令行标志运行(例如,python-O main.py)。当__debug__为False的时候,装饰器返回未修改的最初函数,以避免额外调用及其相关的性能损失。

这个第一次迭代解决方案使用如下:

运行的时候,这段代码中的有效调用产生如下的输出(本节中的所有代码在Python 2.6和Python 3.0下同样地工作,因为两个版本都支持函数装饰器,我们没有使用属性委托,并且我们使用Python 3.0式的print调用和意外构建语法):

取消掉对任何无效调用的注释,将会由装饰器引发一个TypeError。下面是允许最后两行运行的时候的结果(和往常一样,我省略了一些出错消息文本以节省篇幅):

在系统命令行,使用-O标志来运行Python,将会关闭范围测试,但是也会避免包装层的性能负担——我们最终直接调用最初未装饰的函数。假设这只是一个调试工具,可以使用这个标志来优化程序以供产品阶段使用:

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

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

发布评论

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