【问题标题】:cannot load sub-packages in a python package using `__all__` in the `__init__.py` file无法使用 `__init__.py` 文件中的 `__all__` 加载 python 包中的子包
【发布时间】: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 package init


【解决方案1】:

__all__ 不是这样做的。 __all__ 是导入模块时可见的模块成员列表。像以前一样在__init__ 文件中使用import 可能是加载包的最佳方式,除非您有一些特殊原因导致这不起作用。

【讨论】:

  • 感谢您的洞察力。但是我仍然有点不确定您所说的“可见”是什么意思。我还在我的问题中添加了一个编辑部分,因为我意识到我之前选择了一个非常糟糕的例子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多