2009-07-11 9 views
1

OKだから、from-importimportと「正確に」同じですが、名前空間の設定が異なるため、明らかにそうではありません。"from-import" execモジュール全体ですか?

utilsモジュールには1つまたは2つの機能があり、標準ライブラリloggingモジュールを組み込んでいますので、私の質問は主にモチベーションです私がしなければ

import logging 
logger = logging.getlogger("mine") 

# log stuff 

しかし、私が知りたいことはある:私は再びログをインポートします

import logging 
logging.basicConfig(filename="/var/log") # I want file logging 

baselogger = logging.getLogger("mine") 
#do some customizations to baselogger 

をし、別のモジュールでそれを使用するために:私はこのようなみかんを行う必要があります伝えることができますfrom utils import awesome_func私のロガーは間違いなくセットアップされ、ロギングモジュールは私が望むようにセットアップされますか?

これは他の一般的なセットアップにも適用されます。

答えて

5

は、答えはイエスであるように次のようになります。あなたの質問に

$ echo 'print "test" 
def f1(): 
    print "f1" 

def f2(): 
    print "f2" 

' > util.py 

$ echo 'from util import f1 
f1() 
from util import f2 
f2() 
' > test.py 

$ python test.py 
test 
f1 
f2 

$ 
+0

ありがとうございました。実際に小さなテストロギングモジュールを使ってこれを具体的に行うと、正しく初期化されていることがわかります。 – quodlibetor

1

はい、from MODULE import OBJECTはモジュール内のすべてを実行してから効果的にOBJECT = MODULE.OBJECTを実行します。モジュールは既にsys.modulesディクショナリに存在するため、ある意味では既にロードされていることがわかります。

6

答えはイエスです。

インポートプロセスの詳細については、Frederik Lundhの "Importing Python Modules"を参照してください。

特に、クエリに答えるセクションを引用します。

モジュールをインポートするにはどうすればよいですか?

[...]

  1. モジュールコードをロードsys.modules辞書
  2. にそのモジュールオブジェクトを挿入
  3. (これは本質的に辞書である)新しい、空のモジュールオブジェクトを作成しますオブジェクト(必要に応じてモジュールを最初にコンパイル)
  4. 新しいモジュールの名前空間でモジュールコードオブジェクトを実行します。コードによって割り当てられたすべての変数は、モジュールオブジェクトを介して使用可能になります。

from-importの使用上の :

はモジュール

をインポートするには多くの方法があります[...] Xインポートaから

、 b、cはモジュールXをインポートし、現在の名前空間内の参照を指定されたオブジェクトに作成します。つまり、プログラムでaとbとcを使用できるようになりました。

注記私はいくつかの事柄を省略しました。ドキュメント全体を読む価値はありますが、実際はかなり短いです。

+0

ありがとう、私は私の質問をする前にそれを実際に読んだが、私は "X import a、b、cから"というセクションがきれいであるとは思わなかった。これは、上記のセクションとまったく同じようにモジュールをインポートしないためです。しかし、提供された他のすべての証拠に基づいて、それは確かに十分に近いです。 – quodlibetor

0

上記のとおり、はい。 そして、あなたは確かに簡単なテストを書くことができます。

# file m.py 
import sys 

# define function 
def f(): 
    pass 

#execute this when module is loaded (i.e. imported or run as script) 
print 'imported', __name__ 
# print all "exposed" variables to make sure that the f is visible 
print dir(sys.modules[__name__]) 

# file main.py 
from m import f 
print 'done' 

私はいくつかのインポートまたはサブクラス化または他のthomethingがどのように機能するか疑問に、このようなテストにあなたがしているすべての時間を書いてお勧めします。

関連する問題