Python|グローバル変数のスコープ責任整理法
この記事のポイント
- グローバル変数のスコープ責任をレビュー視点で整理できる
- 依存構造の崩壊要因と防止策を理解できる
- 初期化タイミング管理の考え方を学べる
- PlantUMLで依存構造の肥大化・整理イメージを可視化できる
そもそもグローバル変数とは
Pythonにおける「グローバル変数」とは「モジュールスコープで定義された共有変数」を指します。
典型的なグローバル変数
# config.py
DATABASE_URL = "postgres://localhost:5432/db"- モジュールインポート時に読み込まれる
- 他モジュールからimportで参照可能
- モジュール単位のシングルトン相当として利用されがち
なぜこれをレビューするのか
グローバル変数は便利で強力ですが、設計崩壊の起点になりやすい強い設計臭を放ちます。レビューアーは以下を読み取る必要があります。
レビューアー視点
- どこで誰が初期化責任を持っているのか
- 依存スコープが適切に限定管理されているか
- 再代入(可変性)が暴走可能性を孕んでいないか
- テスト時に状態が汚染・干渉しないか
- 複数モジュール間での参照が逆流していないか
開発者視点
- 早期実装ではとにかく外部に置けば便利に見える
- importだけで共有できる手軽さに依存しがち
- 初期化順序の危険性を軽視しがち
- テスト実行時の状態不安定化に気づきにくい
グローバル変数の危険な設計臭
典型的な設計崩壊症状
- 初期化時点の不確定性
- 変更責任の所在不明化
- 依存逆流(呼び出し元が参照元を操作)
- テスト汚染(状態共有による副作用連鎖)
- フラグ変数化(動的可変構成情報)
崩壊例を順に見ていきます。
良くない実装例: ケース1(初期化責任曖昧)
config.py
DATABASE_URL = None
def init_config():
global DATABASE_URL
DATABASE_URL = "postgres://localhost:5432/db"
@Reviewer初期化責任が曖昧です。呼び出し漏れで状態不定リスクがあります。構成情報は不変型で確定初期化を推奨します。
問題点
- 初期化忘れで実行時エラー
- 初期値依存処理が暗黙化
良くない実装例: ケース2(可変状態汚染)
feature_flag.py
FEATURE_ENABLED = False
def enable_feature():
global FEATURE_ENABLED
FEATURE_ENABLED = True
def disable_feature():
global FEATURE_ENABLED
FEATURE_ENABLED = False
@Reviewer状態変更責務が分散し副作用が暴走しやすい構造です。設計責任を移譲してください。
問題点
- 呼び出し順依存発生
- テスト環境間干渉
グローバル設計崩壊の依存構造モデル
- 全レイヤからアクセス集中
- 状態汚染と循環依存が誘発される
グローバル依存整理の設計アプローチ
グローバル変数を適切に制御するには以下の整理技法が有効です。
① 不変化設計(Immutable化)
- 初期化時点で確定固定
- 再代入経路を設けない
② Config Objectパターン導入
- コンストラクタ引数渡しで依存注入
- 可視スコープを限定管理
③ シングルトン管理型導入
- ラッパー管理下で状態可変性制御
- 直接代入経路を排除
④ DIコンテナ設計併用
- フレームワーク依存分離
- コンテキストスコープ統制
改善例:不変化設計
immutable_config.py
class Config:
def __init__(self, database_url: str):
self.database_url = database_url
CONFIG = Config(database_url="postgres://localhost:5432/db")- 再代入不可
- 変更責務分離
改善例:依存注入整理
app_entry.py
from immutable_config import CONFIG
from db_client import DBClient
db = DBClient(CONFIG.database_url)
app = Application(db_client=db)- 明示注入経由でスコープ明確化
- テスト用モック容易化
グローバル依存は「注入に逃がす文化」
レビューアーは「import依存せず渡しているか?」を常に確認すると健全性が保たれます。
改善構造モデル:責務分離整理
観点チェックリスト
まとめ
グローバル変数は「静かに侵食する設計臭」を孕みます。
レビューアーは「グローバルではなくスコープ可視化文化」を継続指導することで、設計健全性の防波堤を築くことができます。

