在Python中实现子模块以便只加载最终用户使用的子模块的最佳策略是什么?

在Python中实现子模块以便只加载最终用户使用的子模块的最佳策略是什么?,python,lazy-loading,python-module,Python,Lazy Loading,Python Module,在Python中实现子模块以便只加载最终用户使用的子模块的最佳策略是什么 我做了检查,有很多关于这个主题的问题和答案,但我找不到任何具体的大纲或建议的方法,使只有用户特别要求的子模块得到导入 我显然不了解模块的具体机制。但到目前为止,我一直在使用\uuuu init\uuuu.py,它似乎加载了所有的子模块,尤其是我在其中导入的子模块。因此,参考清楚地展示了加载模块的预期功能和策略的材料将具有教育意义(谢谢) 例如,假设我构建了一个模块,该模块创建特定类型的序列,但有几种风格。例如,FixedS

在Python中实现子模块以便只加载最终用户使用的子模块的最佳策略是什么

我做了检查,有很多关于这个主题的问题和答案,但我找不到任何具体的大纲或建议的方法,使只有用户特别要求的子模块得到导入

我显然不了解模块的具体机制。但到目前为止,我一直在使用
\uuuu init\uuuu.py
,它似乎加载了所有的子模块,尤其是我在其中导入的子模块。因此,参考清楚地展示了加载模块的预期功能和策略的材料将具有教育意义(谢谢)

例如,假设我构建了一个模块,该模块创建特定类型的序列,但有几种风格。例如,FixedSequence可能是抽象基类,FixedList、FixedByteArray和FixedArray是实现的子类(flavors),但可能只需要其中的一个或两个。如果有人执行“导入fixedsequences”,我如何设置顶层模块使所有内容都可用,但不加载它们。其中模块结构是

./fixedsequences
  ./fixedsequences/__init__.py
  ./fixedsequences/fixedsequence.py
  ./fixedsequences/fixedlist.py
  ./fixedsequences/fixedbytearray.py
  ./fixedsequences/fixedarray.py
/fixedsequences/\uuuuu init\uuuuu.py
如下所示:

from .fixedsequence import FixedSequence
from .fixedlist import FixedList
from .fixedbytearray import FixedByteArray
from .fixedarray import FixedArray
假设
\uuuu init\uuuuuupy
中的所有导入都会导致加载所有模块,这是错误的吗?我不得不假设是的

因此,如果我希望这些子模块是可加载的,但不加载,除非用户明确地从基本模块中导入它们或按属性名称引用它们,或者其中一个子模块这样做


最佳策略,欢迎提供最佳模块和包结构的教育材料。

您必须从
\uuu init\uuuuuuuuy.py
中删除导入,然后包的用户必须使用fixedsequences.fixedsequence导入fixedsequence的完整路径导入这些模块,而不是从fixedsequences导入
固定顺序
。您不能(合理地)有条件地仅导入子模块dynamically@IainShelvington是的,我意识到我没有提到我的问题的一部分,包括如何制作干净漂亮的模块,以便在每个模块中不暴露无关的支持变量、外部模块和函数。因为最初我只是使用一个空的
\uuuuu init\uuuuu.py
,然后当您导入模块时,您将获得所有内容和更多内容。我想这其实并不重要,只是当人们试图阅读内联文档或查找方法名时,它只是让他们有更多的内容可供搜索。感谢您的评论。您必须从您的
\uuuu init\uuuuuuuuu.py
中删除导入,然后包的用户必须使用完整路径
从fixedsequences.fixedsequence导入fixedsequence
而不是从fixedsequences导入fixedsequence导入这些模块。您不能(合理地)有条件地仅导入子模块dynamically@IainShelvington是的,我意识到我没有提到我的问题的一部分,包括如何制作干净漂亮的模块,以便在每个模块中不暴露无关的支持变量、外部模块和函数。因为最初我只是使用一个空的
\uuuuu init\uuuuu.py
,然后当您导入模块时,您将获得所有内容和更多内容。我想这其实并不重要,只是当人们试图阅读内联文档或查找方法名时,它只是让他们有更多的内容可供搜索。谢谢你的评论。