Pythonでの定数の宣言(定義)と使い方

Pythonでの定数の宣言(定義)と使い方

Pythonでの定数の宣言(定義)と使い方について解説します。Pythonの機能には事実上の定数は用意されておらず、慣習的なルールのみによって成り立っているため他の人が書いたコードを読んだり、引き継いで修正したりする場合は注意しましょう。

目次

Pythonにおける定数

定数は変数同様データを入れておくための名前のついた箱のようなものですが、変数と異なり値の再代入ができないという特性を持ちます。

Pythonでは定数を言語としてサポートしていませんが、慣習的なルールとして変数名を全て大文字にした場合は定数として扱うことになっています。といってもあくまで慣習的なルールのため、Pythonの定数は値を再代入することができてしまいます。

例えば次のようなコードを実行した場合、本来の定数であれば値を再代入できないはずですが、Pythonでは扱いが変数と変わらないため再代入できてしまいます。

ADMIN_EMAIL = "sample@example.com" # ADMIN_EMAIL定数に値を代入
print(ADMIN_EMAIL)
ADMIN_EMAIL = "sample@example.co.jp" # ADMIN_EMAIL定数に値を再代入
print(ADMIN_EMAIL)

実行結果は次のようになります。

sample@example.com
sample@example.co.jp

最初に定義した定数の値がその後の再代入によって書き換えられているのがわかります。

このようにPythonでは厳密に定数を作ることができないため、他の人が書いたコードを変更する際は定数の中身を書き換えてしまわないよう注意しましょう。

どうしても定数を使いたい場合

Pythonには定数は用意されていませんが、自分で定数クラスを作ってしまうことはできます。

次のコードを任意のファイル名(const.pyなど)で保存し、モジュールとして読み込んであげましょう。

"""
Constant types in Python.
"""

class _const:
    class ConstError(TypeError):
        pass

    def __setattr__(self, name, value):
        if name in self.__dict__:
            raise self.ConstError("Can't rebind const (%s)" % name)
        self.__dict__[name] = value

import sys
sys.modules[__name__]=_const()

まくまくPythonノート様 Python で定数を定義する https://maku77.github.io/python/syntax/const.html より

constクラスから生成したオブジェクトは値を再代入しようとするとConstErrorを返します。

他のモジュール同様、インポートして使いましょう。例えばconst.pyというファイル名で先ほどのコードを保存した場合は次のように記述します。

import const # constモジュールをインポート

const.ADMIN_EMAIL = "sample@example.com" # constクラスからADMIN_EMAILオブジェクト(定数)を生成し値を代入
const.ADMIN_EMAIL = "sample@example.co.jp" # ADMIN_EMAILオブジェクトに値を再代入

実行結果は次のようになります。

Traceback (most recent call last):
  File "C:\Users\User\Desktop\python_lessons\test.py", line 4, in <module>
    const.ADMIN_EMAIL = "sample@example.co.jp"
  File "C:\Users\User\Desktop\python_lessons\const.py", line 11, in __setattr__
    raise self.ConstError("Can't rebind const (%s)" % name)
const.ConstError: Can't rebind const (ADMIN_EMAIL)

定数に値を再代入しようとするとちゃんとConstErrorが返されます。

このエントリーをはてなブックマークに追加

コメントを残す

頂いたコメントは一読した後表示させて頂いております。
反映まで数日かかる場合もございますがご了承下さい。