[英]How do I prevent users from importing x from a submodule when it exposed in the parent using __all__
请考虑以下情形:
您在m.py
中定义了m.py
包含函数f
的模块M
它可以像这样调用:
import M; Mf()
模块增长到一个大小,在单个文件中是不切实际的。 您将M
拆分为子模块MX
, MY
, MZ
并将以下内容放在M/__init__.py
:
from .X import * from .Y import * from .Z import * __all__ = ["f"]
原始代码仍然有效:
import M; Mf()
但是,代码的新消费者可能会错误地直接访问子模块:
import M.X;
M.X.f()
我想阻止这种情况,这样所有代码仍然可以直接解决M,而不是任何子模块。
子模块是为了内部代码组织的利益,并且引用M使得将来可以轻松重组。
一种选择是命名子模块_X
, _Y
和_Z
以传达它们是内部的。 这是推荐的方法吗?
一种选择是命名子模块_X,_Y和_Z以传达它们是内部的。 这是推荐的方法吗?
由于您不希望人们访问MX,您需要移动X.py模块,使其不再像MX那样可以将其删除为Kaie建议,但是呃。 因此,是的,您的建议是推荐的方法。
将M/X.py
移动到M/_X.py
在M/__init__.py
有from ._X import f
的行
正如其他人所建议的那样,人们可以访问代码并不一定是一个问题,而且习惯于使用一种渗透到Python设计中的更强大的封装语言进行编程。
子模块是为了内部代码组织的利益,并且引用M使得将来可以轻松重组。
是的,这是我在使用C和C ++并整天处理ABI时所关注的问题。 但是,如果代码很小且经过充分测试,通常不会出现问题。 这是你以后可以轻易解决的问题。 如果你有一天决定重新组织代码让X
为_X
那么我肯定Jenkins可以告诉你还需要更新什么。 :)
有一种方法,但我不认为你会喜欢它:
# M/__init__.py
from .X import *
del X
__all__ = ["x"]
您仍然可以import MX
,但在使用时会抛出Error。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.