Python定数の作り方|変更されない値を定義する基本

Pythonで定数を定義する方法を初心者向けに解説。命名規則、全て大文字での記述、モジュールでの管理、Enumクラスの使い方など実践的な定数の作り方を紹介

Learning Next 運営
21 分で読めます

Python定数の作り方|変更されない値を定義する基本

みなさん、Pythonで定数って使ったことありますか?

プログラムを作っていると「この値は絶対に変更したくない」ということがありますよね。 パイ(π)の値とか、アプリの設定値とか。

実は、Pythonには他の言語のような厳格な定数の仕組みはありません。 でも大丈夫です!慣習的な方法で、わかりやすく定数を定義できるんです。

この記事では、Pythonで定数を作る方法を初心者向けにやさしく解説します。 適切な定数の使い方を覚えて、より読みやすいコードを書けるようになりましょう!

Python定数って何?

定数の基本的な考え方

Pythonにはconstというキーワードがありません。

でも心配いりません! 開発者同士で約束した方法で、定数を表現できるんです。

定数として扱う値には、こんな特徴があります。

  • プログラム実行中に変更されない
  • 意味のある名前が付けられている
  • 複数の場所で同じ値を使用する
  • 設定値や計算に使う固定値

簡単に言うと、「変更してはいけない大切な値」ということですね。

定数の命名ルール

Pythonでは、全て大文字で定数を書くのがお約束です。

# 定数の命名規則(全て大文字)
PI = 3.14159
MAX_SIZE = 100
DATABASE_URL = "localhost:5432"
DEFAULT_TIMEOUT = 30
# 複数の単語はアンダースコアで区切る
MAX_RETRY_COUNT = 3
DEFAULT_USER_NAME = "guest"
API_BASE_URL = "https://api.example.com"

全て大文字で書くことで、「この値は定数ですよ」と他の人に伝えられます。

複数の単語を組み合わせる時は、アンダースコア(_)で区切りましょう。

いろいろな定数を作ってみよう

数値の定数

数学的な定数や設定値でよく使われます。

# 数学的な定数
PI = 3.14159265359
E = 2.71828182846
GOLDEN_RATIO = 1.61803398875
# アプリケーションの設定値
MAX_USERS = 1000
MIN_PASSWORD_LENGTH = 8
DEFAULT_PORT = 8080
TIMEOUT_SECONDS = 30.0
# 使用例
def calculate_circle_area(radius):
return PI * radius ** 2
area = calculate_circle_area(5)
print(f"円の面積: {area}") # 78.53981633975

数値定数を使うことで、計算に使う値の意味が明確になります。

後で値を変更したい時も、定数の部分だけ修正すれば大丈夫ですよ。

文字列の定数

メッセージや設定で使う文字列を定数にできます。

# アプリケーション情報
APP_NAME = "My Application"
VERSION = "1.0.0"
AUTHOR = "Your Name"
# メッセージ定数
SUCCESS_MESSAGE = "処理が正常に完了しました"
ERROR_MESSAGE = "エラーが発生しました"
LOADING_MESSAGE = "読み込み中..."
# 設定値
DATABASE_HOST = "localhost"
DATABASE_NAME = "myapp"
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
# 使用例
def show_app_info():
print(f"アプリケーション: {APP_NAME}")
print(f"バージョン: {VERSION}")
print(f"作者: {AUTHOR}")
show_app_info()

文字列定数を使うと、同じメッセージを複数の場所で使う時に便利です。

メッセージを変更したい時も、定数の部分だけ修正すればOKですね。

リストやタプルの定数

選択肢や設定のリストも定数にできます。

# タプル定数(変更されない)
WEEKDAYS = ("月", "火", "水", "木", "金", "土", "日")
MONTHS = ("1月", "2月", "3月", "4月", "5月", "6月",
"7月", "8月", "9月", "10月", "11月", "12月")
# リスト定数(内容は変更可能だが、定数として扱う)
SUPPORTED_LANGUAGES = ["Python", "JavaScript", "Java", "C++"]
DEFAULT_COLORS = ["red", "green", "blue", "yellow"]
# 辞書定数
HTTP_STATUS_CODES = {
200: "OK",
404: "Not Found",
500: "Internal Server Error"
}
# 使用例
def get_weekday_name(day_index):
if 0 <= day_index < len(WEEKDAYS):
return WEEKDAYS[day_index]
return "不正な曜日"
print(get_weekday_name(0)) # 月
print(get_weekday_name(6)) # 日

コレクション型の定数は、プログラムで使う選択肢をまとめるのに便利です。

定数をファイルで管理しよう

設定専用ファイルを作る

大きなプロジェクトでは、定数を別のファイルで管理すると便利です。

複数のファイルで同じ設定を使いたい時に威力を発揮しますよ。

# config.py ファイル
"""アプリケーション設定定数"""
# データベース設定
DATABASE_HOST = "localhost"
DATABASE_PORT = 5432
DATABASE_NAME = "myapp"
DATABASE_USER = "postgres"
# API設定
API_BASE_URL = "https://api.example.com"
API_TIMEOUT = 30
API_RETRY_COUNT = 3
# ログ設定
LOG_LEVEL = "INFO"
LOG_FILE = "app.log"
LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
# アプリケーション設定
APP_NAME = "My Web Application"
VERSION = "1.2.0"
DEBUG_MODE = False
MAX_UPLOAD_SIZE = 10 * 1024 * 1024 # 10MB
# セキュリティ設定
SECRET_KEY = "your-secret-key-here"
SALT_LENGTH = 16
PASSWORD_MIN_LENGTH = 8

設定専用のファイルを作って、関連する定数をまとめます。

これで設定を一箇所で管理できるようになりますね。

定数を使う側のファイル

# main.py ファイル
import config
def connect_database():
connection_string = f"postgresql://{config.DATABASE_USER}@{config.DATABASE_HOST}:{config.DATABASE_PORT}/{config.DATABASE_NAME}"
print(f"データベース接続: {connection_string}")
return connection_string
def setup_logging():
import logging
logging.basicConfig(
level=config.LOG_LEVEL,
format=config.LOG_FORMAT,
filename=config.LOG_FILE
)
print(f"ログ設定完了: {config.LOG_FILE}")
def show_app_info():
print(f"アプリケーション: {config.APP_NAME}")
print(f"バージョン: {config.VERSION}")
print(f"デバッグモード: {config.DEBUG_MODE}")
# 使用例
connect_database()
setup_logging()
show_app_info()

他のファイルからimportして定数を使用します。

設定を変更したい時は、config.pyだけ修正すれば全体に反映されます。

Enumを使った高度な定数

Enumクラスって何?

enumモジュールを使うと、もっと構造化された定数を作れます。

関連する定数をグループ化して管理したい時にとても便利ですよ。

from enum import Enum
class Color(Enum):
RED = "red"
GREEN = "green"
BLUE = "blue"
YELLOW = "yellow"
class Status(Enum):
PENDING = "pending"
PROCESSING = "processing"
COMPLETED = "completed"
FAILED = "failed"
# 使用例
def process_task(status):
if status == Status.PENDING:
print("タスクは待機中です")
elif status == Status.PROCESSING:
print("タスクを処理中です")
elif status == Status.COMPLETED:
print("タスクが完了しました")
elif status == Status.FAILED:
print("タスクが失敗しました")
# Enumの使用
current_status = Status.PROCESSING
process_task(current_status)
# 全ての値を取得
print("利用可能な色:")
for color in Color:
print(f" {color.name}: {color.value}")

Enumクラスを使うと、関連する定数を一つのクラスにまとめられます。

間違った値を使うリスクも減らせるので、とても安全ですね。

数値を扱うIntEnum

数値の定数で比較演算をしたい時は、IntEnumが便利です。

from enum import IntEnum
class Priority(IntEnum):
LOW = 1
MEDIUM = 2
HIGH = 3
URGENT = 4
class HttpStatus(IntEnum):
OK = 200
NOT_FOUND = 404
INTERNAL_SERVER_ERROR = 500
# 使用例
def handle_task(priority):
if priority >= Priority.HIGH:
print(f"優先度{priority}のタスクを緊急処理します")
else:
print(f"優先度{priority}のタスクを通常処理します")
# 比較演算が可能
handle_task(Priority.URGENT) # 優先度4のタスクを緊急処理します
handle_task(Priority.LOW) # 優先度1のタスクを通常処理します
# HTTP ステータスコードの使用
def check_response_status(status_code):
if status_code == HttpStatus.OK:
return "成功"
elif status_code == HttpStatus.NOT_FOUND:
return "リソースが見つかりません"
elif status_code == HttpStatus.INTERNAL_SERVER_ERROR:
return "サーバーエラー"
else:
return "不明なステータス"
print(check_response_status(200)) # 成功

IntEnumを使うと、数値として比較演算ができる定数を作れます。

実際のプロジェクトで使ってみよう

設定管理クラス

クラス内で定数を管理すると、関連する設定をまとめて管理できます。

class AppSettings:
"""アプリケーション設定定数"""
# データベース設定
DB_HOST = "localhost"
DB_PORT = 5432
DB_NAME = "myapp"
DB_TIMEOUT = 30
# キャッシュ設定
CACHE_TIMEOUT = 3600 # 1時間
CACHE_MAX_SIZE = 1000
# ファイル設定
UPLOAD_DIR = "uploads"
MAX_FILE_SIZE = 5 * 1024 * 1024 # 5MB
ALLOWED_EXTENSIONS = ("jpg", "jpeg", "png", "gif", "pdf")
# メール設定
SMTP_HOST = "smtp.gmail.com"
SMTP_PORT = 587
EMAIL_TIMEOUT = 10
@classmethod
def get_db_config(cls):
"""データベース設定を辞書で取得"""
return {
"host": cls.DB_HOST,
"port": cls.DB_PORT,
"database": cls.DB_NAME,
"timeout": cls.DB_TIMEOUT
}
@classmethod
def is_allowed_file(cls, filename):
"""ファイル拡張子が許可されているかチェック"""
if '.' not in filename:
return False
extension = filename.rsplit('.', 1)[1].lower()
return extension in cls.ALLOWED_EXTENSIONS
# 使用例
db_config = AppSettings.get_db_config()
print(f"データベース設定: {db_config}")
print(f"image.jpg は許可: {AppSettings.is_allowed_file('image.jpg')}")
print(f"virus.exe は許可: {AppSettings.is_allowed_file('virus.exe')}")

クラス内で定数を管理すると、関連する機能もまとめて実装できます。

ゲームの設定定数

ゲーム開発では、バランス調整のために設定値を定数で管理することが多いです。

class GameConfig:
"""ゲーム設定定数"""
# 画面設定
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
FPS = 60
# プレイヤー設定
PLAYER_SPEED = 5
PLAYER_LIVES = 3
PLAYER_SIZE = 32
# 敵設定
ENEMY_SPEED = 2
ENEMY_SIZE = 24
MAX_ENEMIES = 10
# スコア設定
ENEMY_POINTS = 100
BONUS_POINTS = 500
HIGH_SCORE_FILE = "highscore.txt"
# 色設定
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
class Player:
def __init__(self, x, y):
self.x = x
self.y = y
self.size = GameConfig.PLAYER_SIZE
self.speed = GameConfig.PLAYER_SPEED
self.lives = GameConfig.PLAYER_LIVES
def move(self, direction):
if direction == "left":
self.x -= self.speed
elif direction == "right":
self.x += self.speed
# 画面内に制限
self.x = max(0, min(self.x, GameConfig.SCREEN_WIDTH - self.size))
# 使用例
player = Player(100, 500)
print(f"プレイヤー位置: ({player.x}, {player.y})")
print(f"プレイヤー体力: {player.lives}")

ゲームバランスの調整が必要な時も、定数の値を変更するだけで済みます。

定数を使う時の注意点

変更されないようにする工夫

リストは変更できてしまうので、タプルを使って安全にしましょう。

# 良い例:タプルで変更を防止
SUPPORTED_FORMATS = ("jpg", "png", "gif")
# 注意が必要な例:リストは変更可能
SUPPORTED_FORMATS_LIST = ["jpg", "png", "gif"]
# リストの場合、内容を変更できてしまう
SUPPORTED_FORMATS_LIST.append("bmp") # 変更される
print(SUPPORTED_FORMATS_LIST) # ['jpg', 'png', 'gif', 'bmp']
# タプルの場合、変更はエラーになる
try:
SUPPORTED_FORMATS.append("bmp") # エラー
except AttributeError as e:
print(f"エラー: {e}") # 'tuple' object has no attribute 'append'

変更されたくない場合は、タプルやfrozensetを使いましょう。

わかりやすい名前を付ける

定数名は、その値の目的や用途がすぐにわかるようにしましょう。

# 良い命名例
MAX_RETRY_COUNT = 3
DEFAULT_TIMEOUT = 30
DATABASE_CONNECTION_STRING = "postgresql://localhost:5432/mydb"
# 改善が必要な命名例
MAX = 3 # 何の最大値か不明
TIMEOUT = 30 # どのタイムアウトか不明
DB = "postgresql://localhost:5432/mydb" # 略語で不明確
# 意味のある名前を付ける
API_REQUEST_MAX_RETRY_COUNT = 3
HTTP_REQUEST_TIMEOUT_SECONDS = 30
MAIN_DATABASE_CONNECTION_STRING = "postgresql://localhost:5432/mydb"

後から見た時に、すぐに理解できる名前を付けることが大切です。

定数の配置場所

定数はファイルの先頭やモジュールの最初に配置しましょう。

# ファイルの先頭に定数を配置
# constants.py または config.py
# アプリケーション設定
APP_NAME = "My Application"
VERSION = "1.0.0"
# データベース設定
DATABASE_URL = "postgresql://localhost:5432/mydb"
DATABASE_TIMEOUT = 30
# その他の設定
LOG_LEVEL = "INFO"
DEBUG_MODE = False
# 関数やクラスの定義
def main():
print(f"アプリケーション {APP_NAME} v{VERSION} を開始します")
if __name__ == "__main__":
main()

定数を見つけやすい場所に配置することで、メンテナンスが楽になります。

まとめ

Pythonでの定数の作り方について、基本から実践的な活用例まで解説しました。

定数の基本

  • 全て大文字で命名する
  • アンダースコアで単語を区切る
  • 意味のある名前を付ける

定数の種類

  • 数値定数:計算や設定で使用
  • 文字列定数:メッセージや設定値
  • コレクション定数:選択肢やリスト

管理方法

  • 設定ファイルで一元管理
  • Enumクラスでグループ化
  • クラス内で関連設定をまとめる

Pythonには厳密な定数の仕組みはありませんが、適切な命名規則と使い方で読みやすいコードが書けます。

最初は基本的な定数から始めて、徐々にEnumや設定モジュールも活用してみてください。

定数を上手に使って、より品質の高いプログラムを作ってみてくださいね!

関連記事