如何将所有从 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."
几个月前,我碰巧在某个 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."