記事内にはプロモーションが含まれています

【Python】定数を宣言する正しい方法!命名規則や別ファイル管理など

【Python】定数を宣言する正しい方法!命名規則や別ファイル管理など Python

プログラミングにおいて、消費税率や円周率、設定値など「変更したくない値」を扱う場面は頻繁にあります。

他の言語(JavaやC++など)では constfinal といったキーワードを使って「定数」を定義できますが、Pythonには言語仕様として厳密な「定数」が存在しません

「じゃあ、書き換えられたくない値はどう管理すればいいの?」
「大規模な開発で定数を一箇所にまとめたい」

そんな疑問を持つ方のために、この記事ではPythonにおける定数の基本的な扱い方(命名規則)から、Final 型ヒントを使った静的チェック、さらに Enum や別ファイルを使った管理テクニックまで、現在の開発現場で推奨される方法を徹底解説します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はこじんまりとしたプログラミングスクールを運営
  • モットーは「利他の精神」

Pythonにおける定数の基本ルール(命名規則)

Pythonには「定数(書き換え不可能な変数)」を宣言するための専用構文はありません。

その代わり、「変数名をすべて大文字にする」 という命名規則(PEP 8)を守ることで、開発者同士で「これは定数だから書き換えないでね」という意思表示を行います。

全て大文字でスネークケースを使う

定数として扱いたい変数は、アルファベットの大文字とアンダースコア _ を使って命名します。

# 定数の宣言(慣習)
TAX_RATE = 0.1
MAX_USER_COUNT = 100
DEFAULT_URL = "https://example.com"

print(f"消費税率は {TAX_RATE * 100}% です。")

TAX_RATEMAX_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.pyconstants.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の案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。