1

作業中のPythonディレクトリに次のものを作成します。

packagename/__init__.py
packagename/modulename.py
test.py

modulename.pyで、空のクラスを作成します。

class Someclass(object):
   pass

test.pyで:

import packagename
packagename.modulename.Someclass()

test.pyでpackagename.modulename.someclass()を呼び出せないのはなぜですか?

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

私は正しい方法が次のとおりであることを理解しています:

import packagename.modulename

また

from packagename import modulename

しかし、私の場合、なぜこのエラーが発生するのかわかりません。

アップデート:

言い換えると、個別の名前空間にあるすべてのモジュールを含むパッケージのコンテンツをインポートする方法はありますか?次の正しいpythonic式が必要です。

from packagename import * as mynamespace
4

3 に答える 3

2

Python はサブパッケージを自動的に再帰およびインポートしません。あなたが言う時:

import packagename

インポートするのはそれだけです。あなたが言うなら:

import packagename.modulename

次に、最初に をインポートしpackagename、次にインポートpackagename.modulenameて参照をの属性として割り当てますpackagename。したがって、コードで言うと:

packagename.modulename.Someclass()

Python は100% 通常の属性ルックアップを使用しているだけです。packagenameまず、現在の名前空間で変数を検索します。modulename次に、オブジェクトの属性を検索しpackagenameます。Someclass次に、オブジェクトの属性を検索しmodulenameます。

import を怠った場合、 calledpackagename.modulenameには明らかに属性がなく、今後は.packagenamemodulenameAttributeError

コマンドラインにポップして何かをインポートし、それを使用dir()して調べることをお勧めします。次に、サブパッケージをインポートして、dir()再度使用します。すぐに違いがわかります。


最後に、構文:

from packagename.modulename import SomePackage

基本的にこれと同じです:

import packagename.modulename
SomePackage = packagename.modulename.SomePackage

(もちろん、実装方法は異なりますが、ほぼ同じ結果になります)。

それは役に立ちますか?

于 2009-12-27T19:40:41.770 に答える
1

「packagename」パッケージに 100 個のモジュールがある場合、最上位の名前だけをインポートしたときに、それらすべてを自動的にインポートしますか? これは通常は良い考えではないため、Python はそれを行いません。

その特定のモジュールを自動的にインポートしたい場合は、次の__init__.pyように含めるだけです。

from packagename import modulename

または、Python 2.5 または 2.6 を使用します。

from __future__ import absolute_import
from . import modulename

(それ以降のバージョンでは、この部分を削除できますfrom __future__。)

編集: Python にパッケージ内のすべての可能なサブモジュールをインポートするように要求する組み込みのメカニズムはありません。__init__.pyこれは一般的なユースケースではありません。必要なものを正確にインポートすることで、明示的に処理する方が適切です。仕事をするために何かをまとめることは可能ですが(を使用する__import__()など)、ほとんどの場合、説明されているようにすべてのサブモジュールを明示的にインポートすることをお勧めします。

于 2009-12-27T19:39:24.727 に答える
0

一部のパッケージは非常に大きく、パッケージ内のすべてをインポートするには時間がかかります。ユーザーが本当に必要なものだけをインポートできるように、インポートの粒度を細かく設定することをお勧めします。

于 2009-12-27T19:37:47.690 に答える