パッケージのすべてのサブモジュールで使用できる定数を定義したいと考えています。最適な場所は__init__.py
ルート パッケージのファイルであると考えました。しかし、これを行う方法がわかりません。いくつかのサブパッケージがあり、それぞれにいくつかのモジュールがあるとします。これらのモジュールからその変数にアクセスするにはどうすればよいですか?
もちろん、これが完全に間違っていて、より良い代替手段がある場合は、それを知りたいです。
パッケージのすべてのサブモジュールで使用できる定数を定義したいと考えています。最適な場所は__init__.py
ルート パッケージのファイルであると考えました。しかし、これを行う方法がわかりません。いくつかのサブパッケージがあり、それぞれにいくつかのモジュールがあるとします。これらのモジュールからその変数にアクセスするにはどうすればよいですか?
もちろん、これが完全に間違っていて、より良い代替手段がある場合は、それを知りたいです。
に入れることができるはずです__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 *
それでも、パッケージ モジュールの名前空間に定数が自動的に含まれることはありません。パッケージ内の各モジュールは、明示的に定数を frommypackage
または fromからインポートする必要がありmypackage.constants
ます。
それをしてはいけない。個々のモジュールの名前空間に定数を明示的にインポートする必要があります。これを実現する最善の方法は、「config」モジュールで定数を定義し、必要な場所にインポートすることです。
# mypackage/config.py
MY_CONST = 17
# mypackage/main.py
from mypackage.config import *
どこからでもグローバル変数を定義できますが、それは本当に悪い考えです。モジュールをインポートし、__builtin__
このモジュールに属性を変更または追加すると、突然、新しい組み込み定数または関数が作成されます。実際、私のアプリケーションが gettext をインストールすると、何もインポートせずにすべてのモジュールで _() 関数を取得します。したがって、これは可能ですが、もちろん、再利用可能なパッケージやモジュールではなく、アプリケーション タイプのプロジェクトに対してのみです。
いずれにせよ、この方法を推奨する人はいないと思います。名前空間の何が問題になっていますか? このアプリケーションにはバージョン モジュールがあるため、「グローバル」変数を使用できversion.VERSION
ますversion.PACKAGE_NAME
。
config.ini ファイルを使用して定数を使用し、configparser ライブラリを使用してスクリプトで解析できることを追加したかっただけです。このようにして、複数の状況で定数を使用できます。たとえば、2 つの個別の URL リクエストにパラメータ定数がある場合は、次のようにラベルを付けます。
mymodule/config.ini
[request0]
conn = 'admin@localhost'
pass = 'admin'
...
[request1]
conn = 'barney@localhost'
pass = 'dinosaur'
...
Python Web サイトのドキュメントは非常に役に立ちました。Python 2 と 3 に違いがあるかどうかはわかりませんので、両方へのリンクを次に示します。
Python 3 の場合: https://docs.python.org/3/library/configparser.html#module-configparser
Python 2 の場合: https://docs.python.org/2/library/configparser.html#module-configparser