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 に答える