パッケージのすべてのサブモジュールで使用できる定数を定義したいと思います。一番いい場所は__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 *
それでも、パッケージモジュールの名前空間に定数が自動的に含まれるわけではありません。パッケージ内の各モジュールは、定数を明示的に、mypackage
またはから明示的にインポートする必要がありmypackage.constants
ます。
from mypackage.constants import *
コピーを配置MY_CONSTANT
します
MY_CONSTANT
、モジュールのいずれかで変更を行うと、どこでも変更されます。MY_CONSTANT
モジュールのいずれかに再割り当てした場合、そのモジュールにのみ影響します。それがあなたの意図であるならば、あなたは属性によって参照しなければなりません、すなわちmypackage.constants.MY_CONSTANT
。
mymodule.py
、__init__.py
以前にインポートMY_CONSTANT = 42
すると失敗することmymodule.py
MY_CONSTANT
です。したがって、MY_CONSTANT = 42
上に移動する必要がありますimport mymodule
それをしてはいけない。個々のモジュールの名前空間に定数を明示的にインポートする必要があります。これを達成するための最良の方法は、「config」モジュールで定数を定義し、それを必要なすべての場所にインポートすることです。
# mypackage/config.py
MY_CONST = 17
# mypackage/main.py
from mypackage.config import *
sys.modules
ます。
グローバル変数はどこからでも定義できますが、これは非常に悪い考えです。__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
from . import MY_CONSTANT