2

如果我想使用它们,为什么我必须导入所有子包?
我将用一个例子来解释自己:

In [1]: import cime

In [2]: cime.runners
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/home/miki/testit/<ipython-input-2-35e09c66121a> in <module>()
----> 1 cime.runners

AttributeError: 'module' object has no attribute 'runners'

In [3]: import cime.runners

In [4]: cime.runners
Out[4]: <module 'cime.runners' from '/home/miki/testit/venv/lib/python2.7/site-packages/cime/runners/__init__.pyc'>

如您所见,它是一个普通的 Python 包:

In [5]: cime.__file__
Out[5]: '/home/miki/testit/venv/lib/python2.7/site-packages/cime/__init__.pyc'

In [6]: ls /home/miki/testit/venv/lib/python2.7/site-packages/cime
download.py   __init__.py   log.py   runners/  run.pyc   utils.pyc
download.pyc  __init__.pyc  log.pyc  run.py    utils.py

但这不会发生在内置模块中。为什么?

In [7]: import os  # instead of import os.path

In [8]: os.path
Out[8]: <module 'posixpath' from '/home/miki/testit/venv/lib/python2.7/posixpath.pyc'>

谢谢,
魔方

PS我在一个virtualenv中,但我不知道这是否重要。

4

2 回答 2

2

这是cime(无论是什么)开发人员的设计决策。一个包不会神奇地导入它的所有子包。这是一件好事,因为否则像 SciPy 这样的大包需要永远导入(就像 NLTK 一样)。

一些包,如os.pathNumPy 和 NLTK 会导入子模块,但它们会明确地这样做。如果您希望这发生在您自己的模块中,请执行

# __init__.py
import .submodule
于 2012-05-24T13:07:10.447 回答
1

os.path是与实现细节相关的异常。Python 对于它会做多少工作通常是保守的,所以它只导入你实际需要的模块。因为实际的实现os.path很大程度上取决于你的操作系统,python 会计算出你需要的实现,并os.path在 python 启动时导入它。

如果你想要的话,你可以通过添加一些额外的导入来获得非常相似的效果cime/__init__.py

from cime import runners

等等。

于 2012-05-24T13:06:38.737 回答