gpt4 book ai didi

python - 从 __init__ 中的 Python 子模块导入方法,但不是子模块本身

转载 作者:太空狗 更新时间:2023-10-30 02:51:16 26 4
gpt4 key购买 nike

我有一个具有以下结构的 Python 模块:

mymod/
__init__.py
tools.py
# __init__.py
from .tools import foo
# tools.py
def foo():
return 42

现在,当 import mymod 时,我看到它有以下成员:

mymod.foo()
mymod.tools.foo()

不过我不想要后者;它只会污染命名空间。

有趣的是,如果 tools.py 被称为 foo.py,您将得到您想要的:

mymod.foo()

(显然,这只有在每个文件只有一个函数的情况下才有效。)

如何避免导入工具?请注意,将 foo() 放入 __init__.py 不是一个选项。 (实际上,许多函数如 foo 绝对会使文件困惑。)

最佳答案

mymod.tools 属性的存在对于维持导入系统的正常功能至关重要。 Python 导入的正常不变量之一是,如果模块 x.ysys.modules 中注册,则 x 模块有一个 y 属性引用 x.y 模块。否则,像

import x.y
x.y.y_function()

break,根据Python版本,甚至

from x import y

可以打破。即使您不认为自己正在做任何会破坏的事情,其他工具和模块也依赖于这些不变量,并且尝试删除该属性会导致大量兼容性问题,而这根本不值得。


试图让 tools 不出现在你的 mymod 模块的命名空间中有点像试图不让“私有(private)”(前导下划线)属性出现在你的对象的命名空间。这不是 Python 设计的工作方式,并且试图强制它以这种方式工作会导致比它解决的问题更多的问题。

前导下划线约定不仅适用于实例变量。您可以使用前导下划线标记您的 tools 模块,并将其重命名为 _tools。这将防止它被 from mymod import * imports 获取(除非你明确地将它放在 __all__ 列表中),并且它会改变 IDE 和 linters 处理的方式尝试直接访问它。

关于python - 从 __init__ 中的 Python 子模块导入方法,但不是子模块本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56595899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com