返回介绍

装饰器参数VS函数注解

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

有趣的是,Python 3.0中提供的函数注解功能,可能为我们在指定范围测试的示例中所使用的装饰器参数给出了一种替代方法。正如我们在第19章中学到的,注解允许我们把表达式和参数及返回值关联起来,通过在自己的def头部行中编写它们。Python把注解收集到字典中并且将其附加给注解的函数。

我们可以在示例中的标题行编写范围限制,而不是在装饰器参数中编写。我们将仍然需要一个函数装饰器来包装函数以拦截随后的调用,但我们基本上换掉了装饰器参数语法:

注解语法如下:

现在,范围限制移到了函数自身之中,而不是在外部编写。如下的脚本说明了两种方案下的最终装饰器的结构,以不完整的框架代码给出。装饰器参数编码模式就是我们前面给出的完整解决方案,注解替代方案需要一个较少层级的嵌套,因为它不需要保持装饰器参数:

运行的时候,两种方案都会访问同样的验证测试信息,但是,以不同的形式——装饰器参数版本的信息保持在封闭作用域的一个参数中;注解版本的信息保持在函数自身的一个属性中:

我将充实基于注解的版本留作一个建议的练习,其编码和我们前面给出的完整解决方案是相同的,因为范围测试信息直接在函数上而不是在一个封闭作用域中。实际上,所有这些给我们带来的是工具的一个不同的用户接口——仍然需要像前面一样,根据期待的参数名称来匹配参数名称,以获取相对位置。

实际上,在这个例子中,使用注解而不是装饰器参数确实限制了其用途。首先,注解只在Python 3.0下有效,因此,Python 2.6不再得到支持;另一方面,带有参数的函数装饰器,在两个版本下都有效。

更重要的是,通过把验证规范移动到def标题中,我们基本上给函数指定了一个单独的角色——因为注解允许我们为每个参数只编写一个表达式,它可以只有一个用途。例如,我们不能为其他用途而使用范围测试注解。

相反,由于装饰器参数在函数自身之外编写,所以它们更容易删除并且更通用——函数自身的代码并没有暗含任何单一的装饰目的。实际上,通过带有参数的嵌套装饰器,我们可以对同一个函数应用多个扩展步骤;注解直接只支持一个步骤。使用装饰器参数,函数自身也保留一个简单的、常规的外观。

然而,如果有单一的目的,并且只使用Python 3.X,那么在注解和装饰器参数之间的选择很大程度上只是风格和个人主观爱好了。就像生活中常见的现象,一个人的注解恰好是另一个人的语法垃圾...

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

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

发布评论

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