2009-09-05 24 views
72

パッケージのすべてのサブモジュールで使用できる定数を定義します。私は、最高の場所はルートパッケージの__init__.pyファイルにあると思っていました。しかし、私はこれを行う方法を知らない。いくつかのサブパッケージがあり、それぞれにいくつかのモジュールがあるとします。これらのモジュールからその変数にアクセスするにはどうすればよいですか?__init__.pyを使ってグローバル変数を定義することはできますか?

もちろん、これが完全に間違っていて、より良い選択肢がある場合は、私はそれを知りたいと思います。

答えて

120

あなたが__init__.pyでそれらを置くことができるようになります。これを達成するための最良の方法はどこでもあなたがそれを必要とし、「設定」モジュールであなたの定数を定義し、それをインポートすることです。これはいつも行われています。

mypackage/__init__.py

MY_CONSTANT = 42 

mypackage/mymodule.py

その後
from mypackage import MY_CONSTANT 
print "my constant is", MY_CONSTANT 

、インポートのmymodule:まだ

>>> from mypackage import mymodule 
my constant is 42 

、あなたは一定の持っているならば(constants.py、config.py、...)をモジュールに入れて、パッケージの名前空間に入れたい場合は、それらをインポートするのが合理的です(ベストプラクティス、おそらく)。

mypackage/__init__.py

from mypackage.constants import * 

それでも、これは自動的にパッケージモジュールの名前空間に定数が含まれていません。パッケージ内の各モジュールは、mypackageまたはmypackage.constantsから明示的に定数をインポートする必要があります。

+0

ええ、あなたはそれらをインポートする必要があります。 –

+9

これは受け入れられた回答だったはずです。 Python 2.5以降で作業している場合は、[here](http://docs.python.org/2/tutorial/modules.html#intra-package-references)で説明されているだけでなく、明示的な相対インポートも使用できます。 'から。 import MY_CONSTANT' – ThatAintWorking

+0

この回答は正しいものであり、回避策ではなく直接的な解決策を示しています。これを提供してくれてありがとう、それは受け入れられた答えでなければなりません。 +1 – Hazok

30

これはできません。各モジュールの名前空間に定数を明示的にインポートする必要があります。

# mypackage/config.py 
MY_CONST = 17 

# mypackage/main.py 
from mypackage.config import * 
+0

うん、コンフィギュレーション・ファイルは何ですかをお願いします。私はちょうど__init__.pyが良い場所になると思った。 あなたのソリューションは、標準的なプラクティスのように聞こえます。それは...ですか? –

+0

良い点。私は疑問が、すべてのパッケージモジュールの名前空間に_automatically_配置されているということを認識していませんでした。 –

+0

しかし、スクリプトがconfig.pyをインポートするたびに、内部のコードが実行されます。 config.py内のコードを1回だけ実行することをお勧めしますか?私がconfig.py内のsettings.jsonファイルを読んでいるとし、config.pyをインポートするたびにopen()したくないとします。 – Augiwan

2

どこからでもグローバル変数を定義できますが、それは本当に悪い考えです。 __builtin__モジュールをインポートし、このモジュールに属性を変更または追加すると、突然、新しい組み込み定数または関数があります。実際、私のアプリケーションがgettextをインストールすると、何もインポートせずにすべてのモジュールで_()関数を取得します。これは可能ですが、もちろんアプリケーションタイプのプロジェクトでのみ使用でき、再利用可能なパッケージやモジュールでは使用できません。

そして、私は誰もこの練習をとにかくお勧めしないと思います。名前空間で何が問題になっていますか?上記のアプリケーションはバージョンモジュールを持っていますので、version.VERSIONversion.PACKAGE_NAMEなど

1

のような変数を使用できるようになりました。config.iniファイルを使用して定数を使用し、スクリプト内でconfigparserライブラリ。このように、複数の状況に対して定数を持つことができます。あなたは二つの別々のURL要求のパラメータ定数を持っていた場合たとえば、ちょうどそうようにそれらにラベルを付ける:

mymodule/config.ini 
[request0] 
conn = '[email protected]' 
pass = 'admin' 
... 

[request1] 
conn = '[email protected]' 
pass = 'dinosaur' 
... 

は、私は非常に参考にPythonのWebサイト上の文書を発見しました。私は、Python 2と3の間の差異はとてもここに存在する場合は、両方へのリンクですわからない:

Pythonの3の場合:Pythonの2のためにhttps://docs.python.org/3/library/configparser.html#module-configparser

https://docs.python.org/2/library/configparser.html#module-configparser

関連する問題