繁体   English   中英

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

[英]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拆分为子模块MXMYMZ并将以下内容放在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建议,但是呃。 因此,是的,您的建议是推荐的方法。

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

  2. M/__init__.pyfrom ._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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM