プログラミングにおいて、消費税率や円周率、設定値など「変更したくない値」を扱う場面は頻繁にあります。
他の言語(JavaやC++など)では const や final といったキーワードを使って「定数」を定義できますが、Pythonには言語仕様として厳密な「定数」が存在しません。
「大規模な開発で定数を一箇所にまとめたい」
そんな疑問を持つ方のために、この記事ではPythonにおける定数の基本的な扱い方(命名規則)から、Final 型ヒントを使った静的チェック、さらに Enum や別ファイルを使った管理テクニックまで、現在の開発現場で推奨される方法を徹底解説します。
![]() 執筆者:マヒロ |
|
Pythonにおける定数の基本ルール(命名規則)
Pythonには「定数(書き換え不可能な変数)」を宣言するための専用構文はありません。
その代わり、「変数名をすべて大文字にする」 という命名規則(PEP 8)を守ることで、開発者同士で「これは定数だから書き換えないでね」という意思表示を行います。
全て大文字でスネークケースを使う
定数として扱いたい変数は、アルファベットの大文字とアンダースコア _ を使って命名します。
# 定数の宣言(慣習)
TAX_RATE = 0.1
MAX_USER_COUNT = 100
DEFAULT_URL = "https://example.com"
print(f"消費税率は {TAX_RATE * 100}% です。")
TAX_RATE や MAX_USER_COUNT のように大文字で書くことで、コードを読む人は「これは定数だな」と直感的に理解できます。
ただし、これはあくまで「慣習」であり、Pythonのインタープリタ(実行環境)はこれを通常の変数として扱います。
そのため、以下のように再代入してもエラーにはなりません。
# 実行できてしまう(警告も出ない)
TAX_RATE = 0.5
print(TAX_RATE) # 0.5
「書き換え可能である」という事実を理解した上で、意図的に書き換えないように運用するのがPythonの流儀です。
型ヒント「Final」を使って書き換えを防ぐ(静的チェック)
Python 3.8以降では、typing モジュールの Final を使うことで、「この変数は再代入禁止である」ことをツールに伝えることができます。
実行時にエラーが出るわけではありませんが、エディタ(VS Codeなど)や静的解析ツール(mypy)が警告を出してくれるようになります。
Finalの使い方
from typing import Final
# Final型ヒントを付ける
PI: Final[float] = 3.14159
API_KEY: Final[str] = "secret_key_12345"
# 再代入しようとすると...
# PI = 3.0
# -> エディタ上で「"PI" is declared as Final and cannot be reassigned」といった警告が出る
PI: Final[float] と記述することで、この変数が定数であることを明示しています。
チーム開発や大規模なプロジェクトでは、この Final を活用して誤った書き換えを未然に防ぐのがモダンな手法です。
上記の例では
API_KEY をソースコードに直書きしていますが、実際の開発でパスワードやAPIキーなどの機密情報をコードに含めるのはセキュリティリスク(漏洩の危険)があります。実務では
.env ファイルやサーバーの環境変数から値を読み込むのが一般的です。定数を「Enum(列挙型)」で管理する
「ステータス(準備中、実行中、完了)」や「曜日」のように、関連する複数の定数をグループとして扱いたい場合は、Enum(列挙型) を使うのがベストプラクティスです。
Enumを使えば、値の重複を防ぎ、コードの可読性を高めることができます。
Enumの定義と使い方
from enum import Enum
class Status(Enum):
PENDING = 1
RUNNING = 2
SUCCESS = 3
ERROR = 4
# 定数の利用
current_status = Status.RUNNING
if current_status == Status.RUNNING:
print("現在実行中です")
# 値の取得
print(Status.SUCCESS.value) # 3
print(Status.SUCCESS.name) # SUCCESS
Enum クラスを継承したクラス(ここでは Status)を作成し、その中に定数を定義します。
Status.RUNNING のようにドットでアクセスできるため、マジックナンバー(意味のわからない数字)をコードに埋め込むよりも意図が明確になります。
また、Enumのメンバーは再代入不可(Status.PENDING = 5 はエラーになる)なので、安全性も確保できます。
文字列定数なら StrEnum が便利(Python 3.11以降)
Python 3.11からは、文字列の定数を扱うのに特化した StrEnum が追加されました。
これを使うと .value を付けなくても文字列として振る舞うため、APIのレスポンス定義などで非常に便利です。
from enum import StrEnum
class Color(StrEnum):
RED = "red"
GREEN = "green"
BLUE = "blue"
# 文字列として直接比較できる
if "red" == Color.RED:
print("赤色です")
定数を「別ファイル」に切り出して管理する方法
アプリケーションが大きくなると、定数の数も増えてきます。
これらをソースコードの中に散らばらせるのではなく、設定専用のファイル(config.py や constants.py)にまとめて管理する方法が一般的です。
別ファイル(constants.py)の作成
# constants.py
import os
# データベース設定
DB_HOST = "localhost"
DB_PORT = 5432
# アプリ設定
APP_NAME = "My Python App"
DEBUG_MODE = True
メインファイルからの読み込み
# main.py
import constants
# モジュール名.定数名 でアクセス
print(f"接続先: {constants.DB_HOST}")
if constants.DEBUG_MODE:
print("デバッグモードが有効です")
import constants とすることで、constants.py に定義された変数を constants.VARIABLE_NAME の形で利用できます。
このようにモジュールとして切り出すことで、定数の一元管理が可能になり、変更があった際も1つのファイルを修正するだけで済みます。
応用:Dataclassを使って構造化する
単なる変数ではなく、dataclass を使って定数を構造化し、frozen=True(書き換え不可)にすることで、より堅牢な設定ファイルを作ることもできます。
from dataclasses import dataclass
@dataclass(frozen=True)
class AppConfig:
title: str = "My App"
version: str = "1.0.0"
max_items: int = 50
# インスタンス化して使う
config = AppConfig()
# config.title = "New Title" # エラーになる(FrozenInstanceError)
print(config.title)
Pythonのスキルを活かして年収を上げる方法
以上、Pythonで定数を宣言する時の正しい方法について解説してきました。
なお、Pythonのスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。
Pythonエンジニアの需要は非常に高いため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなPythonの案件を探しやすくなります。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。



