Pythonでは、定数として扱いたい変数には通常、大文字で表記し、変更しないようにする慣習があります。しかし、Pythonには厳密な定数という概念はないため、変更されないようにするための約束事として扱われます。
Pythonで定数を宣言する一つの方法は、専用のモジュールを定義することです。以下にその例を示します。
# const.py
class _consttype:
class _ConstTypeError(TypeError): pass
def __repr__(self): return "Constant type definitions."
def __setattr__(self, name, value):
v = self.__dict__.get(name, value)
if type(v) is not type(value):
raise self._ConstTypeError(f"Can't rebind {type(v)} to {type(value)}")
self.__dict__[name] = value
def __del__(self): self.__dict__.clear()
import sys
sys.modules[__name__] = _consttype()
そして、インポートしたモジュールに対して定数を代入します。
# recipe_sample.py
import const
const.FOO = "FOO"
print(const.FOO) # ==> FOO
# 再代入はできない
const.FOO = "BAR" # ==> _ConstTypeError
この方法は、再代入ができないという定数の性質を満たします。しかし、この方法にはいくつかの問題点があります。例えば、呼び出しのタイミングに依存するという点や、新しく変なデータ入れられたくないという点、constモジュールがグローバルにただ一つ存在して、アクセス制御ができないという点などです。
これらの問題を解決するために、メタクラスを利用する方法があります。メタクラスは「クラスのクラス」のようなもので、メタクラスのインスタンス=クラスと思ってもらえればよいと思います。メタクラスを利用することで、クラスの定義が正しく行われているかの確認ができます。
以上がPythonで複数の定数を定義する方法についての説明です。Pythonでは定数という概念が厳密には存在しないため、定数を扱う際には注意が必要です。しかし、上記のような方法を利用することで、定数の性質を満たす変数を扱うことができます。.