/images/hugo/avatar.png

16 wrapt 模块实战

装饰器和 wrapt 模块的介绍已经结束,作为整个系列的最后一篇的实战篇,我们来实现在一开始我提出的一个需求

1. 应用场景

在我日常的开发过程中,经常要查询各种数据库,比如 mysql, mongo,es 。基本上所有的数据库对查询语句能添加的查询条件都有限制。对于大批量的查询条件,只能分批多次查询,然后将查询结果合并。我们能不能将这种查询分批在合并的操作抽象出来实现为一个装饰器,在需要时对查询函数包装即可?下面是我的一个实现示例。

15 wrapt 模块使用

GrahamDumpleton wrapt blog 的翻译部分到此就结束。很可惜的是作者并没有把猴子补丁部分写完,查阅了 wrapt 的官方文档,上面只介绍了 wrapt 的装饰器,代理对象以及 synchronized 同步装饰器,也没有介绍猴子补丁相关内容。不过已经介绍的内容足够用了,接下来我想结合 wrapt 的文档介绍一下 wrapt 模块的使用,算是整个博客的总结。

14 为 Python 应用自动打补丁

前面我们已经决绝了猴子补丁的导入次序问题,但是这个解决方案有个前提,就是我们必需能修改应用程序代码,以在程序的最开始执行我们的注册函数。本节我们的目的是找到另一种解决方案取消这个限制。

13 猴子补丁在 Python 中的加载次序问题

本节我们就来解决如何在 Python 中打补丁的问题。

1. 猴子补丁的加载次序问题

在第 11 篇博客中,我们提到了应用猴子补丁时可能存在的问题。具体地说,如果需要被打补丁的模块已经被导入并被其他代码使用,那么它可能已经在自己的名称空间中创建了一个被打补丁的目标函数的本地引用。因此,尽管猴子补丁可以正常工作,但是仍然无法覆盖这种原始函数已经导入,并过通过本地引用直接访问原始函数的情况。

12 使用 wrapt 辅助测试

前面我们说道过 Python 中使用猴子补丁典型情景之一就是使用模拟库来帮助执行单元测试,本节我们先把补丁和模块导入的相对次序问题放一放,先来看看如何使用 wrapt 模块辅助单元测试。

11 在 Python 中安全的使用猴子补丁

在之前 10 篇博客中,我们几乎完整的讨论了装饰器的实现。现在我们将焦点从装饰器转移到猴子补丁上来。

1. 猴子补丁

通常在Python中永远不应该做的事情之一就是编写猴子补丁。但有些人认为这是一种有用的必需品,你可能无法避免修补第三方代码中的错误。其他人则可能会争辩说,现在有这么多的软件是开源的,所以您应该简单地向上游包维护人员提交一个补丁。