作者:萌新求学 | 来源:互联网 | 2022-11-30 11:17
我在使用我们拥有的大型软件仓库来管理导入时遇到了问题.为了清楚起见,让我们假装repo看起来像这样:
repo/
__init__.py
utils/
__init__.py
math.py
readers.py
...
...
现在我们的__init__.py
文件已经设置好,以便我们可以做这样的事情
from repo.utils import IniReader
在这个例子中repo/utils/__init__.py
会有
from .readers import IniReader, DatReader
从可读性的角度来看,这种结构对我们来说效果很好,但我们现在在尝试部署应用程序时遇到了问题.
问题是这个......让我假装我正在编写一个看起来像这样的应用程序:
from repo.utils import IniReader
if __name__ == '__main__':
r = IniReader('blah.ini')
print(r.fields)
现在from repo.utils import IniReader
将执行repo/utils/__init__.py
将在这种情况下将导入IniReader
和 DatReader
.让我们假装DatReader
看起来像这样:
import numpy as np
import scipy
import tensorflow
from .math import transform
class DatReader():
...
它遵循PEP8,所有导入都在文件的顶部.
这里的问题是DatReader
需要一些重量级的导入(例如numpy,scipy,tensorflow是巨大的库).更糟糕的是,from .math import transform
可能有类似的东西from repo.contrib import lookup
然后点击repo/contrib/__init__.py
它开始连锁反应并最终导入我们的整个存储库.
对于我们所有拥有完整开发环境的开发人员而言,这确实不是一个问题,但现在我们正试图(内部)运送应用程序这个导入地狱正成为一个问题.
这个问题有标准解决方案吗?我们已经讨论过只保留__init__.py
空,或者只是没有将所有导入放在文件顶部,如PEP8所述.这两种解决方案都有妥协,所以如果有人有建议或参考,我很乐意听到.
谢谢!