1

他のプロジェクトでプラグ可能な import ステートメントを作成しようとしています。このステートメントは urls.py にあります

したがって、これは機能します:

from forum.urls import urlpatterns
# Base Class:   <type 'list'>

しかし、これはうまくいきません:

from settings import ROOT_URLCONF as project_urls
urlpatterns = __import__(project_urls)
# Base Class:   <type 'module'>

後者を機能させるにはどうすればよいですか?

4

2 に答える 2

1

では、以前のインポートに関連するインポート ステートメントが必要ですか?

間違いなく、ある時点で試したことです。共通のルートを持つ非常に長い import ステートメントがいくつかあったので、それを除外しようとしました。そのままの import ステートメントでは動作しませんでしたが、おそらく努力が足りなかったのでしょう。

import ステートメントのデフォルトの動作は、モジュール オブジェクトを作成することに注意してください。次に、それを sys.modules にバインドし、現在のモジュールの名前空間に import ステートメントの名前でバインドします。http://docs.python.org/tutorial/modules.htmlを参照してください。

モジュール オブジェクトには名前空間があります。モジュールがパッケージでない場合、その名前空間は、モジュールの .py ファイルの内容を評価することから得られます。ただし、パッケージの場合、名前空間は__init__.pyパッケージ内のモジュールから取得されます。パッケージ内の他のモジュールは自動的にインポートされず、パッケージの名前空間では使用できません。それらを個別にインポートする必要があります。

from...import ステートメントは、モジュールを sys.modules にロードします。次に、インポートで参照したモジュールからオブジェクトを引き出します。最後に、そのオブジェクトを import ステートメントの名前で現在のモジュールの名前空間にバインドします。基本的に、ある名前空間から別の名前空間にバインディングをコピーしています。正直なところ、後で使用するときに名前のソースが難読化されることがよくあります (そのため、あまり行いません)。

ポイントへ:

の使用は__import__、インポート ステートメントの制限を回避する 1 つの方法です。Python のドキュメントを参照してください。ただし、 from..import ステートメントを使用する場合は、__import__それがモジュール オブジェクトを指していない限り、結果の名前を再利用しようとしないでください (おそらくそうではありません)。インポートには、ドットで区切られた一連のモジュール名のみが必要です。

同様に、明示的なインポートを配置するだけで、オブジェクトがどこから来たのかを明確に示すことができることに注意してください。

于 2010-08-27T17:11:47.720 に答える
0
urlpatterns = __import__(project_urls).whateversubmodule.urlpatterns
于 2010-08-27T16:17:52.123 に答える