Pythonで定数を扱う方法を解説

Python

命名規則

Pythonでは定数はサポートされていません。そのため、特別な構文はありません。その代わりに以下の命名規則があるのみです。

  • 大文字
  • スネークケース(単語を_で区切る)

定数を利用するメリット

定数を適切に利用することには多くのメリットがあります。

  • コードの可読性向上:値の意味が明確になる
  • メンテナンス性の向上:修正が1箇所で済む
  • 自己文書化コード:コメントがなくても値の目的が理解しやすい

基本的な定数の定義

プログラム内で変更すべきでない値を定数として定義する例です。変更可能ではありますが、命名規則により変更しないという意図を示します。

# 定数の定義
PI = 3.14159
MAX_CONNECTIONS = 100
DATABASE_URL = "postgresql://user:password@localhost/db"

# 定数を使用する
area = PI * radius * radius
if connections > MAX_CONNECTIONS:
    print("接続数が上限を超えています")

モジュールを使用した定数の定義

複数のファイルで共有する定数を別ファイルにまとめる例です。

# constants.py
PI = 3.14159
MAX_CONNECTIONS = 100
DATABASE_URL = "postgresql://user:password@localhost/db"

# main.py
import constants

area = constants.PI * radius * radius
if connections > constants.MAX_CONNECTIONS:
    print("接続数が上限を超えています")

クラス内での定数の定義

クラス内で定数を定義する場合はクラス変数として定義します。

class Config:
    MAX_RETRY = 3
    TIMEOUT = 30
    API_KEY = "your-api-key"

# 使用例
retry_count = 0
while retry_count < Config.MAX_RETRY:
    # リトライ処理
    retry_count += 1

enumモジュールを使用した定数

関連する定数をグループ化するためにenumモジュールを使用する例です。

from enum import Enum, auto

class Color(Enum):
    RED = "#FF0000"
    GREEN = "#00FF00"
    BLUE = "#0000FF"

class Status(Enum):
    PENDING = auto()
    PROCESSING = auto()
    COMPLETED = auto()

# 使用例
current_color = Color.RED
print(current_color.name)  # RED
print(current_color.value)  # #FF0000

current_status = Status.PENDING
print(current_status.name)  # PENDING
print(current_status.value)  # 1

注意点

定数は技術的には変更可能

Pythonでの「定数」は単なる命名規則であり、技術的には変更可能です。

PI = 3.14159
print(PI)  # 3.14159

# 値を変更できてしまう
PI = 3.14
print(PI)  # 3.14

定数を変更されたくない場合

Python 3.8からは型ヒントを使ったFinal修飾子が導入され、値が変更されるべきでないことを示せます。これは静的型チェッカー(mypy等)によって検証されますが、実行時の変更は防げません。

from typing import Final

PI: Final = 3.14159
MAX_CONNECTIONS: Final = 100

# 静的型チェッカーが警告を出すが、実行時にはエラーにならない
PI = 3.14  # mypy: error: Cannot assign to final name "PI"

クラス内で定数を定義する場合も同様に使用できます。

from typing import Final

class Config:
    MAX_RETRY: Final = 3
    TIMEOUT: Final = 30

    def __init__(self) -> None:
        # 以下は静的型チェッカーでエラーになる
        # self.MAX_RETRY = 5  # mypy: error: Cannot assign to final name "MAX_RETRY"
        pass

まとめ

Pythonでは言語レベルでの定数のサポートはありませんが、命名規則や様々なモジュールを使うことで定数を表現できます。基本的な方法としては大文字のスネークケースを使用し、より高度な方法としてはenumモジュールを使用できます。チーム開発では変更すべきでない値を定数として定義し、命名規則を守ることでコードの可読性と保守性が向上します。

タイトルとURLをコピーしました