15

import ステートメントとそのバリエーションを理解するのに苦労しています。

lxmlWeb サイトをスクレイピングするためにモジュールを使用しているとします。

次の例は...

from lxml.html import parse
parse( 'http://somesite' )

...Google の python スタイル ガイドでは、名前空間を保持するために、基本的な import ステートメントを優先しています。

私はそれをしたいのですが、これを試すと:

import lxml
lxml.html.parse( 'http://somesite' )

...その後、次のエラー メッセージが表示されます。

AttributeError: 'module' オブジェクトに属性 'html' がありません

何が起こっているのか理解するのを手伝ってくれる人はいますか? 名前空間内でモジュールを使用したいのですが、セマンティクスを理解するための支援が必要です。

4

3 に答える 3

10
import lxml.html as LH
doc = LH.parse('http://somesite')

lxml.htmlモジュールです。の場合import lxml、モジュールは名前空間htmlにインポートされません。lxmlこれは開発者の決定です。一部のパッケージは一部のモジュールを自動的にインポートしますが、一部のモジュールはインポートしません。この場合、 を使用して自分で行う必要がありますimport lxml.html

import lxml.html as LHモジュールをインポートし、現在のモジュールの名前空間の名前にhtmlバインドします。LHしたがって、 を使用して解析関数にアクセスできますLH.parse


lxmlパッケージ ( など) がモジュール ( などlxml.html) を自動的にインポートするタイミングを詳しく調べたい場合は、ターミナルを開いて次のように入力します。

In [16]: import lxml

In [17]: lxml
Out[17]: <module 'lxml' from '/usr/lib/python2.7/dist-packages/lxml/__init__.pyc'>

lxmlここに、パッケージの__init__.pyファイルへのパスが表示されます。中身を見てみると空っぽ。したがって、サブモジュールはインポートされません。numpy's__init__.pyを見ると、多くのコードが表示されます。

import linalg
import fft
import polynomial
import random
import ctypeslib
import ma

numpyこれらはすべて、名前空間にインポートされるサブモジュールです。したがって、ユーザーの観点からは、、 などへのimport numpyアクセスが自動的に付与されます。numpy.linalgnumpy.fft

于 2012-10-26T20:07:47.577 に答える
6

pkg2つのモジュールをa.py含むパッケージの例を見てみましょうb.py

--pkg
   |
   | -- a.py
   |
   | -- b.py
   |
   | -- __init__.py

__init__.pyあなたはインポートしているのであって、そうではa.pyありません b.py

インポート

したがって、ターミナルを開いて次のことを行うと、次のようになります。

>>> import pkg
>>> pkg.a
>>> pkg.b
AttributeError: 'module' object has no attribute 'b'

a.pypkgにインポートしたのでわかる__init__.pyように、の属性としてアクセスできましたpkgb、そこにはありません。後でこれにアクセスするには、次を使用する必要があります。

>>> import pkg.b   # OR: from pkg import b

HTH、

于 2012-10-26T20:23:00.623 に答える
3

パッケージをimport作成すると、インタープリターは pythonpath でパッケージを検索し、見つかった場合はパッケージの を解析して実行し、__init__.pyそこからパッケージ オブジェクトを構築し、そのオブジェクトを に挿入しますsys.modules。モジュールの場合importing、モジュールオブジェクトを作成して追加することを除いて、同じことを行います。その後、属性 (別名、メンバー メソッド、クラス、サブモジュール、またはサブパッケージ) にアクセスしようとすると、対応するオブジェクトが取得され、必要な子のモジュールまたはパッケージ オブジェクトがsys.modules試行されます。getattrただし、子がまだimported追加されていないサブモジュールまたはサブパッケージである場合sys.modulesは、モジュールまたはパッケージの属性リストに追加されていないため、AttributeError. __init__.pyしたがって、実行時に親で使用できるようにするには、モジュールまたはパッケージをコードで明示的にインポートするか、パッケージで委任する必要があります。

于 2012-10-26T20:15:07.997 に答える