【问题标题】:Is it possible to overwrite a Python built-in for the whole Python package?是否可以覆盖整个 Python 包的内置 Python?
【发布时间】:2019-03-26 16:21:01
【问题描述】:

我有一个包含几十个子包/模块的 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 函数?或者在每个模块中添加一行代码是我唯一的选择?

【问题讨论】:

    标签: python package built-in monkeypatching shadowing


    【解决方案1】:

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

    当您想要默认执行此操作时,问题就出现了,它会覆盖未明确请求更改的代码的标准功能。如果没有一些高权力,你就无法做到这一点。最直接的方法是从源代码重建您的 Python 系统,将标准的 open 替换为您自己的。

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

    【讨论】:

    • 感谢您的帖子,很有用。我不介意编辑代码,没问题。我只是想知道 Python 是否支持在一个地方覆盖一个内置函数,然后让它可用于整个包。出于好奇,是否可以在不导入每个模块的情况下在整个包模块中使用自定义函数(在某些模块中定义的函数my_open_file__init__.py)?
    • 是的,但就像覆盖一样,您必须重新构建 Python 解释器才能为您的添加提供“内置”状态。请记住,您要求做的是更改语言定义:您正在尝试削弱针对您的问题定义的机制,并使您的更改成为标准包的一部分。跨度>
    • 如果我不清楚寻求帮助,我会有点害怕 - 我编写的函数只是内置 open 的包装器 - 它是用 Python 编写的,而不是 C 语言。改变你对我问题的回答?
    • 不,这并没有改变任何东西,除了明显扩大了更改该定义所需的重新编译步骤。
    猜你喜欢
    • 1970-01-01
    • 2014-10-16
    • 2019-12-16
    • 2019-12-01
    • 2020-07-19
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多