2012-01-01 7 views
28

私には理解できないことが1つあります。なぜこのAttributeErrorはPythonで発生しますか?

はなぜこの

import scipy # happens with several other modules, too. I took scipy as an example now... 

matrix = scipy.sparse.coo_matrix(some_params) 

は、このエラーを生成しない:

AttributeError: 'module' object has no attribute 'sparse' 
+3

何が面倒なのですか?モジュールに '疎い'が存在しないとどうなると思いますか? –

+1

私は気づいていませんでした。そのスパースはscipyのサブモジュール*です。サブモジュールは自動的にはインポートされません** - @David Zaslavskyが以下に指摘したように。 – Aufwind

+11

downvotersはなぜ彼らがdownvotedを説明する必要があります、私はこの質問に間違って表示されません。実際、私はそれが非常に良い質問だと思う。 – juliomalegria

答えて

41

scipyモジュールはsparseという名前の任意の属性を持っていないので、これが起こります。その属性は、import scipy.sparseのときにのみ定義されます。

import scipyの場合、サブモジュールが自動的にインポートされません。それらを明示的にインポートする必要があります。ほとんどのパッケージで同じことが言えますが、パッケージは必要に応じて独自のサブモジュールをインポートすることができます。 (例えば、scipy/__init__.pyその後あなたがscipyをインポートするたびsparseサブモジュールがインポートされるだろう。声明import scipy.sparseが含まれている場合)あなたは、スパースscipyのダウンロードではなく、インポートので

+1

私は知らなかった、そのサブモジュールは自動的にインポートされません。ありがとう! – Aufwind

+0

サブモジュールが自動的にインポートされるかどうかはパッケージによって異なります。 –

+0

@Ethan:真実、答えにその旨のメモを編集しました。 –

3

。お試しくださいfrom scipy import sparse

1

AttributeErrorは、オブジェクトの属性が利用できない場合に発生します。

attribute reference期間と名を続け、主である:

attributeref ::= primary "." identifier

例えば、dir()を使用し、そのオブジェクトに対して有効な属性のリストを返すには:

dir(scipy) 

だから、おそらくあなたはimport scipy.sparse

-1

デフォルトの名前空間は"__main__"です。 import scipyを使用すると、Pythonはモジュール名として別の名前空間を作成します。 Pythtonのルールは次のとおりです。別の名前空間から属性を呼び出す場合は、完全修飾属性名を使用する必要があります。

関連する問題