Pythonで定数を定義する方法とは?意外と知らない使い方と注意点も解説!

python

Python(パイソン)は使いやすい文法で人気ですが、「定数(constant)」の使い方については、他のプログラミング言語とは少し違います。

「定数ってどうやって作るの?」「値が変わらないようにするには?」といった疑問を持つ人も多いでしょう。

この記事では、Pythonでの定数の作る裏技、使う場面、気をつけるポイントまで、初心者でもわかりやすく説明します。

スポンサーリンク

Pythonに「定数」はあるの?

Pythonには本当の定数がない

実は、Pythonには「絶対に値が変わらない変数」という機能がありません。

JavaやC言語のように、一度値を決めたら二度と変更できない仕組みが、言語の機能として用意されていないのです。

「えっ、それじゃあ定数は使えないの?」と思うかもしれませんが、安心してください。

Pythonには「これは定数として使おう」という約束事があります。
この約束事を守ることで、プログラムが読みやすくなり、バグも減らすことができます。

文化的な慣習で定数を表現

Pythonのプログラマーたちは、「定数として使う変数」を特別な方法で書くことにしました。

これによって、「この変数は変更しないでね」という気持ちを伝えることができます。

Pythonには厳密な定数機能はありませんが、代わりに命名ルールや特別な方法を使います。では、具体的にどうやって定数を作るのでしょうか?

Pythonで定数を作る方法

大文字で名前をつける方法

Pythonでは、定数には「すべて大文字の変数名」をつけます。これが一番よく使われる方法です。

基本的な定数の書き方

PI = 3.14159
MAX_USER = 100
APP_NAME = "マイアプリ"

この書き方を見ると、他のプログラマーは「あ、これは定数だから変更しちゃダメだな」と理解できます。

注意:実際には変更できてしまう

PI = 3.14159
PI = 3  # エラーにならない(でも変更すべきではない)

Pythonの文法では変更できてしまいますが、開発者同士の「暗黙の約束」として、大文字の変数は変更しないことになっています。

単語をつなげる時のルール

定数の名前が長くなる時は、アンダースコア(_)でつなげます。

MAX_LOGIN_ATTEMPTS = 3
DEFAULT_TIMEOUT_SECONDS = 30
DATABASE_CONNECTION_STRING = "localhost:5432"

このルールを「スネークケース」と呼びます。

単語と単語の間に線(_)を引いて、ヘビ(スネーク)のように見えるからです。

命名ルールによる定数作成は簡単ですが、うっかり変更してしまう可能性があります。

次に、もう少し安全な方法を紹介します。

定数の変更を防ぐ高度な方法

クラスを使った方法

プログラムで定数が変更されるのを防ぎたい場合は、クラスという仕組みを使います。

class Const:
    PI = 3.14159
    MAX_USER = 100
    
    def __setattr__(self, name, value):
        raise TypeError("定数は変更できません")

# 定数を使う
const = Const()
print(const.PI)  # 3.14159

# 変更しようとするとエラーになる
# const.PI = 3  # TypeError: 定数は変更できません

この方法だと、定数を変更しようとした時にエラーメッセージが表示されます。

typing.Finalを使う方法(Python 3.8以降)

新しいバージョンのPython(3.8以降)では、typing.Finalという機能が使えます。

from typing import Final

PI: Final = 3.14159
MAX_USER: Final = 100

ただし、この方法は「型チェックツール」と呼ばれる特別なプログラムでしかチェックされません。

普通に実行する時は、やっぱり変更できてしまいます。

定数が活躍する具体例

設定値をまとめる

アプリケーションの設定値を定数にまとめると、管理がしやすくなります。

# アプリケーションの設定
DEBUG_MODE = True
API_URL = "https://api.example.com"
TIMEOUT_SECONDS = 5
MAX_RETRY_COUNT = 3

設定を変更したい時は、この部分だけを修正すれば済みます。

条件分岐で使う

HTTPステータスコードやエラーコードを定数にすると、プログラムが読みやすくなります。

# ステータスコードを定数にする
STATUS_OK = 200
STATUS_NOT_FOUND = 404
STATUS_SERVER_ERROR = 500

# 使用例
if response.status_code == STATUS_OK:
    print("データを正常に取得しました")
elif response.status_code == STATUS_NOT_FOUND:
    print("データが見つかりませんでした")

数字だけ書くより、何を意味するかがわかりやすいですね。

定数ファイルを分ける

定数が多くなったら、別のファイルにまとめることができます。

constants.py(定数ファイル)

# API関連の定数
BASE_URL = "https://api.example.com"
API_VERSION = "v1"
TIMEOUT = 30

# データベース関連の定数
DB_HOST = "localhost"
DB_PORT = 5432
DB_NAME = "myapp"

main.py(メインプログラム)

from constants import BASE_URL, API_VERSION

# 定数を使用
api_url = f"{BASE_URL}/{API_VERSION}/users"

このように定数を1か所にまとめると、コードの管理がとても楽になります。

定数を使うことで、プログラムが読みやすくなり、修正も簡単になります。最後に、Pythonで定数を使う時に気をつけるポイントをまとめておきます。

Pythonの定数で気をつけるポイント

定数でも値は変えられる

一番大切なポイントです。Pythonの定数は、技術的には普通の変数と同じです。

PI = 3.14159
PI = 3  # エラーにならないが、やってはいけない

定数を変更しないのは、プログラマー同士の「約束」だということを覚えておきましょう。

リストや辞書を定数にする時の注意

リストや辞書のような「中身を変更できるオブジェクト」を定数にする時は、特に注意が必要です。

# 危険な例
CONFIG = {"debug": True, "version": "1.0"}
CONFIG["debug"] = False  # 中身は変更できてしまう

ALLOWED_EXTENSIONS = [".jpg", ".png", ".gif"]
ALLOWED_EXTENSIONS.append(".bmp")  # 新しい要素を追加できてしまう

変数名は変更していませんが、中身は変わってしまいます。

安全な解決策

中身を変更されたくない場合は、タプル(tuple)を使いましょう。

# 安全な方法
ALLOWED_EXTENSIONS = (".jpg", ".png", ".gif")  # タプルは変更不可

# 辞書の場合は少し複雑
from types import MappingProxyType
CONFIG = MappingProxyType({"debug": True, "version": "1.0"})

タプルやMappingProxyTypeは、一度作ったら中身を変更できません。

定数をどこに書くかも大切

定数はファイルの上の方や、専用のファイルにまとめて書きましょう。

良い例

# ファイルの上部に定数をまとめる
MAX_ATTEMPTS = 3
TIMEOUT = 30

def login_user():
    # 関数の中で定数を使用
    pass

悪い例

def some_function():
    MAX_ATTEMPTS = 3  # 関数の中に定数を書くのは良くない

まとめ

Pythonでの定数の使い方は、他の言語とは少し違います。重要なポイントをまとめると:

定数の作り方

  • 変数名をすべて大文字にする
  • 単語の間はアンダースコア(_)でつなぐ
  • より安全にしたい場合はクラスやtyping.Finalを使う

定数を使うメリット

  • プログラムが読みやすくなる
  • 設定の変更が簡単になる
  • バグが減る

気をつけるポイント

  • Pythonの定数は変更可能(約束として変更しない)
  • リストや辞書は中身を変更されやすい
  • 定数はファイルの上部や専用ファイルにまとめる

コメント

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