我在我的项目中使用内部导入时遇到了困难。这是我的项目的部分树结构:
app
|- Gui.py
|- Main.py
|- logger.py
|- config.py
|- WebParser (package)
|- __init__.py
|- LinksGrabber.py
|- LyricsGrabber.py
|- ImagesGrabber.py
|- (Many other packages...)
logger.py
和模块在每个包的config.py
模块中都是必需的,并且是独立的(仅使用内置模块)。从包内部访问这些模块很棘手。
这就是我尝试实现它的方式,用于启用配置访问和日志记录功能WebParser\LinksGrabber.py
:
# WebParser\__init__.py:
sys.path.append('..') # for outside-package modules
import config
from logger import log
# WebParser\LinksGrabber.py:
import WebParser
config = WebParser.config
log = WebParser.log
问题:
- 这有代码气味。我敢打赌有更好的方法来实现这种行为。
- 我想立即调用
import WebParser
并使用WebParser.LinksGrabber
andWebParser.LyricsGrabber
,而不是隐式导入它们。这可以通过导入内部的模块来完成__init__.py
,但这是不可能的,因为每个包的模块都会导入包本身,并且会发出递归导入。
您能否提出更好的实现或不同的代码设计?