我想使用最上面的__all__
文件中的__init__.py
属性加载子包,而不是在那里使用import
,但不幸的是,我无法让它工作。
这是一个简化的例子:
我有我的包裹
pdbsr/
__init__.py*
...
extras/
__init__.py
...
*
此星号应突出显示我正在讨论的__init__
文件。
所以当我把线放
import extras
进入__init__.py
文件,一切正常。当我在解释器中测试模块时,我得到以下响应,这表明模块已成功加载:
>>> import pdbsr
>>> pdbsr.extras
<module 'pdbsr.extras' from '.../site-packages/pdbsr/extras/__init__.pyc'>
在新的python shell中,我用import extras
文件替换了__init__.py
__all__ = ["extras"]
我遇到了问题:
>>> import pdbsr
>>> pdbsr.extras
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'extras'
>>> extras
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'extras' is not defined
任何人都知道我要通过__all__
加载子包来做什么?
我为上面给出的非常糟糕的例子道歉。
所以我最初的想法是我可以简化我的__init__.py
文件。
例如,我现在
`from pdbfile.new_pdb import *`
`from pdbfile.[...] import *`
`from pdbfile.[...] import *`
等等。由于每个子包都有很多.py
个文件,因此我的__init__
文件变得非常庞大。
例如,pdbsr / pdb_file / new_pdb包含类NewPdb()
,我可以在解释器中调用
>>> import pdbsr
>>> new = pdbsr.NewPdb()
(我想避免使用其他点符号,例如pdbsr.new_pdb.NewPdb()
)
答案 0 :(得分:0)
这不是__all__
所做的。 __all__
是导入模块时可见的模块成员列表。像以前一样在import
文件中使用__init__
可能是加载包的最佳方式,除非你有一些特殊原因可以解决这个问题。