【发布时间】:2013-07-24 05:19:50
【问题描述】:
我想在最上面的__init__.py 文件中使用__all__ 属性而不是在那里使用imports 来加载子包,但不幸的是,我无法让它工作。
这里是一个简化的例子:
我有我的包裹
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中,我将__init__.py文件中的import extras替换为
__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())
【问题讨论】:
-
Python module and __all__ 的可能重复项
标签: python module package init