2012-02-15 20 views
11

私はこれを行う場合:PythonでなぜPythonモジュールをインポートしても、ネストされたモジュールをインポートできないのですか?

import lxml 

lxml.htmlがインポートされません。たとえば、私はlxml.html.parse()関数を呼び出すことはできません。なぜこれはそうですか?

+3

'import os'はあなたのコードで' os.path.whatever'を使うことができます。したがって、それはモジュール作成者の責任です。 –

答えて

12

は、概念的には簡単な操作です:

  1. は、インポートに対応するの.pyファイルを検索します。これにはPythonのパスとその他の機械が含まれますが、特定の.pyファイルが見つかります。

  2. インポートのすべてのディレクトリレベル(import foo.bar.bazには2つのレベルがあります)に対応する__init__.pyファイルを見つけて実行します。これを実行すると、ファイル内のすべての最上位レベルの文が実行されます。

  3. 最後に、.pyファイル自体(この場合はfoo/bar/baz.py)が実行され、すべての最上位レベルの文が実行されます。その実行の結果として作成されたすべてのグローバルは、モジュールオブジェクトにバンドルされ、そのモジュールオブジェクトはインポートの結果です。

サブパッケージをインポートしなかった場合、それらのサブパッケージは使用できません。彼らがサブパッケージをインポートした場合、それらは利用可能です。パッケージ作成者は、希望どおりに行うことができます。

+0

パッケージをインポートするとき、手順1で見つかった.pyファイルはパッケージの\ _ \ _ init \ _ \ _。pyです。サブパッケージがその\ _ \ _ init \ _ \ _。pyファイルにインポートされない限り、それらは使用できません。 –

1

これは、全体を使用しないマルチパートライブラリの場合、最小限のコードしかロードできないようにするためです。たとえば、lxmlの部分がhtmlではない可能性があります。そのため、コードの読み込みに対処する必要はありません。

2

lxmlはモジュールではなくパッケージです。パッケージとはモジュールの集まりです。また、パッケージを直接インポートすることもできますが、サブモジュールのすべてを自動的にインポートするわけではありません。

については、なぜか、これはBDFLの問題です。パッケージは一般的にかなり大きいので、サブモジュールをすべてインポートするとパフォーマンスが低下することが考えられます。

6

lxmlは、Pythonでpackageと呼ばれ、モジュールの階層的集合です。パッケージは膨大なものになる可能性があります。そのため、パッケージをインポートする際に取り込まれる内容を選択することができます。そうしないと、誰もが完全な階層をインポートしなければならなくなり、リソースがかなり浪費されます。

4

これは仕様です。パッケージには__init__.pyにネストされたパッケージをインポートするオプションがあり、問題なくネストされたパッケージにアクセスできます。これはパッケージ作成者のための選択肢の問題です。意図していないコードの量を最小限に抑えることが目的です。 Pythonでモジュールやパッケージをインポート

関連する問題