如何将所有从 Python 包导出的符号放在包范围内?

How can I place all symbols exported from a Python package at the package scope?

几个月前,我碰巧在某个 Python 项目中使用了 BeautifulSoup,我注意到该库的组织方式有些独特。

为了使用 BeautifulSoup class 你只需要导入顶级包,像这样:

from bs4 import BeautifulSoup

soup = BeautifulSoup(html)

我知道是因为BeautifulSoupclass,基本上是图书馆唯一提供的class,直接放在__init__.py里面bs4 目录,其明确目的是简化库的导入。

我想知道在我构建自己的库时这种做法是否合适。

显然通过在 __init__.py 中写入 class 主体将 classes 放在包范围内会无限期地膨胀文件,但我也不喜欢通常的 Python 每个模块通常只有一个 class(或任何代码单元)的方式。

简而言之,我不喜欢这样写多余的 import 语句,这在每个模块放置一个 class 时似乎是不可避免的:

from mylibrary.splendidparser import splendidparser
from mylibrary.supremetimer import supremetimer
from mylibrary.superbrenderer import superbrenderer

相反,我更喜欢 BeautifulSoup 方式:

from mylibrary import splendidparser
from mylibrary import supremetimer
from mylibrary import superbrenderer

有什么方法可以打包我的库以启用这种导入样式而不膨胀 __init__.py

您不必将实现放在 __init__.py 中。您可以将定义放在包目录中的其他模块中,然后只需将它们导入 __init__.py 即可从那里获得它们。

是的,这很合适。试试 import this,你会看到 Python 的禅宗,社区试图遵循,包括 "Flat is better than nested."