【Python】グローバル変数を別ファイルで管理・利用する方法

【Python】グローバル変数を別ファイルで管理・利用する方法

公開: 更新:



Pythonのグローバル変数を別ファイルで管理する方法

Pythonのグローバル変数を別ファイルで管理することによって、複数のモジュール間でデータを共有することが可能です。この方法はプログラムの構造を整理しやすくなり、変数一元管理を実現する際にに役立ちます。以下ではグローバル変数を別ファイルに定義して、他のファイルからインポートする最初に行う方法から説明します。

まず、グローバル変数を管理するためのファイルを作成し、必要な変数を定義することが最初のステップです。この専用ファイルを作ることによって、プログラム全体で使用する値を一箇所に集約でき、変更が必要な場合も修正箇所を特定できます。

他のファイルからグローバル変数を使用する場合は、インポートを使用するだけです。Pythonのモジュールシステムを活用することによって、変数の値を変更した際にその変更がすべてのインポート先に反映されるという利点があります。

【サンプルコード】
counter = 0
app_name = "MyPythonApp"
settings = {
    "debug": True,
    "max_users": 100,
    "version": "1.0.0"
}

import globals

def increment_counter():
    globals.counter += 1
    print(f"カウンター: {globals.counter}")

def show_app_info():
    print(f"アプリ名: {globals.app_name}")
    print(f"設定情報: {globals.settings}")

increment_counter()
increment_counter()
show_app_info()

globals.app_name = "UpdatedApp"
show_app_info()
【実行結果】
カウンター: 1
カウンター: 2
アプリ名: MyPythonApp
設定情報: {'debug': True, 'max_users': 100, 'version': '1.0.0'}
アプリ名: UpdatedApp
設定情報: {'debug': True, 'max_users': 100, 'version': '1.0.0'}
行番号 詳細説明
1行目 グローバル変数としてcounterを0で定義
2行目 グローバル変数としてapp_nameに文字列(MyPythonApp)を定義
3行目 settingsというディクショナリを開始
4行目 ディクショナリのdebugキーにTrueを設定
5行目 ディクショナリのmax_usersキーに100を設定
6行目 ディクショナリのversionキーに1.0.0を設定
7行目 settingsディクショナリの定義を終了
9行目 globalsモジュールをインポート
11行目 increment_counter関数を定義
12行目 インポートしたglobalsモジュールのcounterをインクリメント
13行目 カウンターの値をprint関数で表示
15行目 show_app_info関数を定義
16行目 globalsモジュールのapp_nameを表示
17行目 globalsモジュールのsettingsを表示
19行目 increment_counter関数を呼び出し
20行目 increment_counter関数をもう一度呼び出し
21行目 show_app_info関数を呼び出し
23行目 globalsモジュールのapp_nameをUpdatedAppに変更
24行目 変更後のapp_nameをshow_app_info関数で表示

【PR】『Python』を学べる企業・個人向けのプログラミングコース

別ファイルのグローバル変数を更新する方法

別ファイルに定義されたグローバル変数を更新する場合、インポートしたモジュール名を通じて直接アクセスしましょう。Pythonではモジュールもオブジェクトとして扱えるため、モジュールの属性として変数を参照し値を変更できます。

グローバル変数を更新するときは代入操作を行うだけですが、変数を定義した同一ファイル内で再代入する場合、globalキーワードを使う場合があります。外部からインポートした変数を更新するだけなら、globalキーワードは不要です。

また、複数のファイルから同じグローバル変数を更新する場合、更新のタイミングや順序に注意してください。あるモジュールで更新が行われると、その変更はインポート先で共有されます。

【サンプルコード】
database_url = "localhost:5432"
max_connections = 10
is_debug_mode = True

import config

def connect_to_db():
    print(f"データベース {config.database_url} に接続します")
    print(f"最大接続数: {config.max_connections}")

def change_db_settings(new_url, new_max):
    config.database_url = new_url
    config.max_connections = new_max
    print(f"設定を更新しました: {config.database_url}, {config.max_connections}")

import config

def log_status():
    if config.is_debug_mode:
        print("デバッグモードで実行中")
    else:
        print("通常モードで実行中")

def toggle_debug_mode():
    config.is_debug_mode = not config.is_debug_mode
    print(f"デバッグモードを {config.is_debug_mode} に変更しました")

import config
import database
import logger

database.connect_to_db()
logger.log_status()

database.change_db_settings("remote-server:5432", 20)
logger.toggle_debug_mode()

database.connect_to_db()
logger.log_status()
【実行結果】
データベース localhost:5432 に接続します
最大接続数: 10
デバッグモードで実行中
設定を更新しました: remote-server:5432, 20
デバッグモードを False に変更しました
データベース remote-server:5432 に接続します
最大接続数: 20
通常モードで実行中
行番号 詳細説明
1行目 config.py内のdatabase_urlを初期化
2行目 config.py内のmax_connectionsを初期化
3行目 config.py内のis_debug_modeを初期化
4行目 configモジュールをインポート
5行目 connect_to_db関数を定義
6行目 config.database_urlを参照して接続先を表示
7行目 config.max_connectionsを参照して最大接続数を表示
9行目 change_db_settings関数を定義
10行目 config.database_urlをnew_urlへ変更
11行目 config.max_connectionsをnew_maxへ変更
12行目 変更内容を表示
14行目 configモジュールを再インポート(例示として記載)
15行目 log_status関数を定義
16行目 config.is_debug_modeの真偽で出力を分岐
17行目 デバッグモードでない場合のメッセージを表示
19行目 toggle_debug_mode関数を定義
20行目 config.is_debug_modeの真偽を反転して代入
21行目 反転後の状態を表示
23行目 configモジュールを再インポート(例示として記載)
24行目 databaseモジュールをインポート
25行目 loggerモジュールをインポート
27行目 database.connect_to_db関数を呼び出し
28行目 logger.log_status関数を呼び出し
29行目 database.change_db_settings関数を呼び出し設定を変更
30行目 logger.toggle_debug_mode関数を呼び出しデバッグモードを切り替え
31行目 再度database.connect_to_db関数を呼び出し変更を確認
32行目 logger.log_status関数を呼び出し最終状態を確認

別ファイルでグローバル変数を利用する時の注意点

別ファイルでグローバル変数を使用する場合、変数の初期化順序に注意してください。循環インポートが発生すると想定外の初期化状態になる可能性があるので、グローバル変数の定義を専用ファイルにまとめると循環インポートを避けやすくなります。

また、グローバル変数を多用しすぎてしまうと、コード全体が複雑になる恐れがあります。更新箇所が増えるほど動作が混乱しやすくなるため、必要最小限に留めてください。クラスを使った設定管理やシングルトンパターンなどの方法も検討してみた方が良いでしょう。

スレッドを併用する場合は、グローバル変数へのアクセス競合に気を配る必要があります。複数スレッドが同時に値を更新する場合は、ロック機構やThreadLocalなどを導入して衝突を回避してください。

※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。

ITやプログラミングに関するコラム


ITやプログラミングに関するニュース

ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。

コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア 金融業界の業務効率化を加速するニッセイアセットマネジメントの生成AI×GAS活用研修事例 - IT・プログラミングを知って学べるコネクトメディア 【製造業のDX人材育成事例】デジタル人材の即戦力化を実現する、日本ガイシ株式会社の異動者向オンボーディング研修 - ITやプログラミングを知って学べるコネクトメディア フューチャーアーキテクト株式会社が実現した新入社員向けIT研修プログラムでタスクフォース制度が主体的な学びと成長を生み出す - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【IT新入社員研修】オンラインとオフラインの最適バランスを実現したFutureOneの導入事例 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【新入社員研修】柔軟なハイブリッド型Java研修で実現した新卒20名の成長と成果|サークレイス株式会社 - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/現場により近いところにデジタルを根付かせるDX基礎講座研修|株式会社ブリヂストン - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/業務の効率化・DX推進に向けたIT人材育成への第一歩|株式会社カナエ - ITやプログラミングを知って学べるコネクトメディア 企業・法人向けのIT・プログラミング研修 - ITやプログラミングを知って学べるコネクトメディア

新着記事

対象者別で探す

子供(小学生・中学生・高校生)向け
プログラミング教室検索する

子供(小学生・中学生・高校生)がロボットやプログラミング言語を学ぶことができるオフラインからオンラインスクールを検索、比較することが可能です。

子供(小学生・中学生・高校生)
プログラミング教室検索する

ITやプログラムなどの
最新情報を検索する

日々、新しいITやプログラミング言語の情報が流れていきますが、特定の情報を時系列でニュースやコラムを確認することができます。

ITやプログラムなどの
最新情報を検索する