2011-11-17 4 views
6

私は、むしろ基本的なように思える質問がありますが、どこでもこのヘルプを見つけることはできません。モジュールとグローバル変数をまたいだPythonのインポート

file_a.py >> 

from xyz import XYZ 
class A: 
    . 
    . 
    . 

file_b.py >> 

import file_a 
from file_a import A 
class B(A): 
    def __init__(self): 
     A.__init__(self) 

    def someMethod(self): 
     XYZ.doSomething() 

XYZ.doSomething()はNameErrorを言って失敗:名「XYZ」が定義されていないfile_aから行う「輸入SYS」のような でも標準輸入はfile_bで、それが使用可能なレンダリングしていないようです。私はそれがうまくいくと思った。私の理解は間違っていますか?はいの場合は、ファイル間で共通のインポートとグローバル変数を使用する方法がありますか? (それが役に立たなかったら、私はC++やJavaのプログラマーで、今はPythonを使い始めています)。

答えて

5

Is my understanding wrong?

はい、ラインfrom file_a import Afile_bの名前空間にのみクラスAをインポートしているため。 file_aの名前空間はそのままです。それはこれが好きではなかった場合は、両方の構文を持つにはほとんど意味があるでしょう:

import modulename 
from modulename import something 

あなたの思考が正しかったかのように、2番目のフォームの後には、必ずmodulename.someotherthingを使用することができるだろう。

スター *オペレータと

If yes, then is there a way to have common imports and global variables across files?

はい、:

from modulename import * 

が、これは一例from file_a import *のための名前空間の汚染の問題は、またfile_bfile_aで行われ、すべての輸入をインポートしますもたらします。あなたはになりますは最終的にあなたの輸入のコントロールを失い、これはしばらくあなたを噛んでいます...これについて私を信頼してください!

何らかの理由from module import *のために必要とされる場合には、名前空間の汚染の回避策は、スター演算子でインポートする必要がどのようなホワイトリストされ、modulevariable __all__で定義することです。

HTH!

4

モジュールをインポートすると、そのモジュールで定義されたすべての変数がその名前空間で使用できます。したがってXYZfile_aモジュールで利用可能な場合、import file_aにアクセスするとXYZfile_a.XYZとアクセスできます。

ここでの一般的なアイデアは、ネームスペースが他のネームスペースの内容で煩雑にならないようにすることです。

1
import file_a 
from file_a import A 

私は問題があると思います:本当にXYZをインポートしないでください!

from fila_a import * 

はあなたの問題を解決することができますが、それは良い方法~~~

あなたはfile_bでこれを書くことができない:それは

from file_a import XYZ 

が行われていますか?

3

はい、間違っています。各モジュールは独自の名前空間であり、そのファイル内で明示的にインポートするものだけがその名前空間で使用できます。

他の回答とは逆に、file_a.XYZを参照するのは特にPythonicではありませんが、これはうまくいきます。代わりに、XYZとsysをfile_bの先頭にインポートする必要があります。

+0

これは私の質問です。私はfile_bのような多くのファイルにわたって一連のインポートを繰り返さないようにしたい。私はXYZとsysをfile_bの作品にインポートすることを知っています。 – ksrini

+1

@ksriniあなたはそれを望むべきではありません。モジュールが使用するすべてのものを明示的にインポートすることは良いことです。すべての依存関係を1か所にきれいに表示します。 PEP20を参照してください - 暗黙的より明示的です。 – yak

+0

ヤックありがとう、面白かったと洞察力があった! – ksrini

関連する問題