1

我想使用最上面文件__all__中的属性而不是在那里使用 s来加载子包,但不幸的是,我无法让它工作。__init__.pyimport

这里有一个简化的例子:

我有我的包裹

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 包含 class NewPdb(),我可以在解释器中调用它

>>> import pdbsr
>>> new = pdbsr.NewPdb()

(我想避免更多的点符号,比如pdbsr.new_pdb.NewPdb()

4

1 回答 1

0

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

于 2013-07-23T20:30:53.300 回答