是否有可能覆盖整个Python包的内置Python?

时间:2019-03-26 16:21:01

标签: python package built-in monkeypatching shadowing

我有一个Python软件包,其中包含数十个子软件包/模块。几乎每个模块都使用open内置Python函数。我已经编写了自己的文件打开功能实现,并希望将包模块中的所有open调用“重定向”到my_open函数。

我知道可以在模块顶部写入open = my_open_file来遮盖模块中的open,但这将意味着编辑每个模块。或者,将open = my_open_file放入包的__init__.py中,然后执行from package_name import open,这还意味着向每个模块添加一行代码。

是否可以在一个地方为包范围定义my_open_file函数?还是在每个模块中添加一行代码是我唯一的选择?

1 个答案:

答案 0 :(得分:1)

请考虑使用此模块需要做什么:您已经编写了自己的软件包,这是对内置函数链接方式的个人更改。您想重新定义标准语言功能。没关系...语言的强大功能之一就是能够按照您定义的方式进行操作。

当您要默认执行 时,问题就来了,这取代了没有显式请求更改的标准功能。没有一些强大的权威,您将无法做到这一点。最直接的方法是从源代码重建Python系统,用您自己的标准open代替。

实际上,“常规”方式是让每个应用程序模块“选择加入”,并明确声明它要使用新的open而不是该语言定义的模块。这是您在第二段中概述的方法。这对您有什么问题?在参数化文件列表的每个列表中插入一行是单个系统命令。