2011-07-02 8 views
-2

a.py:ローカルネームスペースの一部をインポート先に与える方法はありますか?

import b 
import c 
... 
import z 

class Foo(object): 
    ... 

thosesモジュールB-Zの各々は、クラスFOOを使用する必要があります。

インポートのように、すべてのモジュールA〜Zの間接的なアクセス(オブジェクト経由など)を可能にしながら、各モジュールB〜ZがAの名前空間(例:foo)にアクセスできるようにします。

+0

私はあなたが何を求めているのか理解できません。あなたは説明するためにいくつかのコードを投稿できますか? –

+0

できるだけ明確に投稿を編集した後、私はまだ理解できません。あなたは質問を編集し、あなたが本当にやろうとしていることを言うべきです。 – ninjagecko

答えて

2

いいえ。順番にそれぞれAをインポートする必要があります。

+0

循環依存関係==失敗 – JBernardo

+1

@JBernardo:Pythonではありません。適切に実行されると解決できます。 –

+1

"__if done __" ... http://en.wikipedia.org/wiki/Anti-pattern – JBernardo

2

私はまだあなたが求めても、やろうとしたりしているかわかりませんが、これは私の最高の推測です:

通常、ちょうど古典的な輸入品を使用しています。

のIFモジュールが大きすぎる成長している、またはあなたが非常に良いものを分割する理由が、同じ名前空間を共有したいという願望を持っている場合は、ダミーの名前空間に値を「揚げる」ことができます。たとえば、私がwidget.Foowidget.Barを持っていて別のファイルに入れたいのですが、それぞれのファイルにFooBarと入力できるようにしたいのですが、通常はfrom widget import Foofrom widget import Barです。これらのファイル(foo.py、bar.py、baz.py、...、zeta.py)がたくさんある場合は、扱いにくいかもしれません。したがって、widget/__init__.pyに一度だけインポートし、各フォルダ内でfrom foo import *, from bar import *, ...に移動し、各モジュールで1回だけfrom widget import *に行くことで、状況を改善できます。そして、完了しました!...まあ...ほぼ...

これは、あなたが非常に注意する必要がある循環インポートのシナリオにあなたをもたらします:Circular (or cyclic) imports in PythonBarfoo.pyの関数では、すぐに値を使用しないため、すべてが問題ありません。しかし、foo.pyx = Barを実行すると、値がまだ定義されていない可能性があります。

sidenote:__import__機能を使用してプログラムでインポートすることができます。これをos.walkと組み合わせると、ウィジェットフォルダ内の各ファイルにfrom ... import *と入力する必要がなくなります。これは、バグを避けるために不可欠で必要なステップです。

関連する問題