Python 像包一样实现的模块

Python module implemented like a package

我有一个包含程序包的应用程序,因此:

* fruits/
  | citrus/
  | | __init__.py
  | | oranges.py
  | | mandarins.py
  | | satsumas.py
  | | ... etc

fruits/citrus/ 下的 Python 文件包含 fruits.citrus.Citrus.

的大约 300 个子类的定义

它们只是出于管理原因而存在于这样的单独文件中。没有人应该知道或关心 fruits.citrus.mandarins 等,除非他们正在研究 fruits.citrus 包。换句话说,我希望这个包假装它是一个模块。

我试过把它放在 __init__.py:

from fruits.citrus.oranges import *
from fruits.citrus.mandarins import *
from fruits.citrus.satsumas import *
[...]

g = list(globals().items())

__all__ = list([
    name for name, value in g
    if value.__class__==type and
    issubclass(value, Citrus)
    ])

这种作品,你可以看到fruits.citrus.Tangerine。但是 pydoc 和 sphinx 仍然将 orangesmandarins 等列为包内容。而且Tangerine都在fruits.citrus.Tangerinefruits.citrus.mandarins.Tangerine,所以事情比我开始的时候还要复杂。

必须有办法做到这一点,但我尝试的一切都是柠檬。帮助?

你能告诉我这是否有助于隐藏那些子模块吗:

from .mandarins import *
from .oranges import *

del globals()['mandarins']
del globals()['oranges']

原来没有什么好办法,不过也行

我试图使用 autodoc 程序来记录代码库,它一直列出所有这些 类 两次。最后的答案就是手写类!