命名規則
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モジュールを使用できます。チーム開発では変更すべきでない値を定数として定義し、命名規則を守ることでコードの可読性と保守性が向上します。