Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以覆盖整个Python包的Python内置程序?_Python_Package_Built In_Monkeypatching_Shadowing - Fatal编程技术网

是否可以覆盖整个Python包的Python内置程序?

是否可以覆盖整个Python包的Python内置程序?,python,package,built-in,monkeypatching,shadowing,Python,Package,Built In,Monkeypatching,Shadowing,我有一个包含数十个子包/模块的Python包。几乎每个模块都使用open内置Python函数。我自己编写了一个文件打开函数的实现,并希望将包模块中的所有open调用“重定向”到my_open函数 我知道可以在模块顶部写入open=my_open_文件,以在模块内隐藏open,但这意味着要编辑每个模块。或者,将open=my_open_file放入包的\uuuu init\uuuuuu.py,然后从包中执行\u name import open,这也意味着向每个模块添加一行代码 是否可以仅在一个位

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

我知道可以在模块顶部写入
open=my_open_文件
,以在模块内隐藏
open
,但这意味着要编辑每个模块。或者,将
open=my_open_file
放入包的
\uuuu init\uuuuuu.py
,然后从包中执行
\u name import open
,这也意味着向每个模块添加一行代码


是否可以仅在一个位置为包范围定义
my_open_file
函数?或者在每个模块中添加一行代码是我唯一的选择?

想想你要求如何处理这个模块:你已经编写了自己的程序包,对内置函数的链接方式进行了个人更改。您希望重新定义标准语言功能。没关系。。。语言的一部分力量是按照你定义的方式做事的能力

当您在默认情况下想要这样做时,问题就出现了,覆盖了没有明确请求更改的代码的标准功能。没有权威,你无法做到这一点。最直接的方法是从源代码重建Python系统,用自己的源代码替换标准的
open


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

谢谢您的帖子,非常有用。我不介意编辑代码,没问题。我只是想知道Python是否支持在单个位置覆盖内置函数,然后使其可用于整个包。出于好奇,是否可以在不导入每个模块的情况下在整个包模块中提供自定义函数(函数
my\u open\u file
在某些模块中定义或
\uuuu init\uuuuuuuuuuuuuuy
)?是的,但与覆盖一样,您必须重新构建Python解释器以提供“内置”状态。请记住,您要求做的是更改语言定义:您试图削弱为您的问题定义的机制,并将您的更改作为标准包的一部分。我有点担心,如果我不清楚是否需要帮助-我编写的函数只是内置的
open
-它是用Python编写的,而不是C。它会改变您对我的问题的回答中的任何内容吗?不,这不会改变任何内容,除了明显扩大必要的重新编译步骤以更改该定义之外。