如何使用__all__阻止用户在子模块中显示x时从子模块中导入x

Dan*_*nov 6 python coding-style

请考虑以下情形:

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

import M.X;
M.X.f()
Run Code Online (Sandbox Code Playgroud)

我想阻止这种情况,这样所有代码仍然可以直接解决M,而不是任何子模块.

子模块是为了内部代码组织的利益,并且引用M使得将来可以轻松重组.

一种选择是命名的子模块_X,_Y以及_Z沟通,他们是内部的.这是推荐的方法吗?

小智 1

一种选择是将子模块命名为 _X、_Y 和 _Z 以表明它们是内部的。这是推荐的方法吗?

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

  1. 搬去M/X.pyM/_X.py

  2. M/__init__.py有线from ._X import f

正如其他人所建议的那样,人们可以访问代码实际上不应该成为问题,并且使用具有更强封装性的语言进行编程的习惯渗透到了 Python 设计中。

子模块是为了内部代码组织的利益,引用M为将来轻松重组留下了可能性。

是的,这是我在使用 C 和 C++ 并整天处理 ABI 时所担心的问题。但如果代码很小并且经过充分测试,这通常不是问题。这是一种稍后可以轻松修复的问题。如果有一天您决定重新组织代码,X那么_X我相信 Jenkins 可以告诉您还需要更新哪些内容。:)