gpt4 book ai didi

python - 当使用 __all__ 在父模块中公开时,如何防止用户从子模块导入 x

转载 作者:太空狗 更新时间:2023-10-30 00:17:50 27 4
gpt4 key购买 nike

考虑以下场景:

  • 您在 m.py 中定义了一个模块 M,其中包含一个函数 f

    可以这样调用:

    import M;
    M.f()
  • 模块增长到无法放在单个文件中的大小。您将 M 拆分为子模块 M.XM.YM.Z 并将以下内容放入 M/__init__ .py:

    from .X import *
    from .Y import *
    from .Z import *

    __all__ = ["f"]

    原始代码仍然有效:

    import M;
    M.f()

但是,代码的新消费者可能会错误地直接访问子模块:

import M.X;
M.X.f()

我想避免这种情况,这样所有代码仍然始终直接寻址 M,而不是任何子模块。

子模块是为了方便内部代码组织,引用M为以后方便重组留了余地。

一个选项是将子模块命名为 _X_Y_Z 以表明它们是内部的。这是推荐的方法吗?

最佳答案

One option would be to name the submodules _X, _Y, and _Z to communicate that they are internal. Is that the recommended approach?

由于您不希望人们访问 M.X,因此您需要移动 X.py 模块,使其不再作为 M.X 提供。您可以按照 Kaie 的建议将其删除,但是呃。因此,是的,您的建议是推荐的方法。

  1. M/X.py移动到M/_X.py

  2. M/__init__.py 中有行 from ._X import f

正如其他人所建议的那样,人们可以访问代码应该不是真正的问题,使用具有更强封装的语言编程的习惯会渗透到您的 Python 设计中。

The submodules are for the benefit of internal code organisation, and referencing M leaves the possibility of easy reorganisation in the future.

是的,这是我从 C 和 C++ 过来并整天处理 ABI 时遇到的一个问题。但如果代码很小并且经过充分测试,这通常不是问题。这是您以后可以轻松解决的问题。如果有一天您决定重新组织代码以将 X 设为 _X,那么我相信 Jenkins 可以告诉您还需要更新哪些内容。 :)

关于python - 当使用 __all__ 在父模块中公开时,如何防止用户从子模块导入 x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15526133/

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