
【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やプログラミングに関するコラム
- 【Windows編】Pythonのバージョンをアップデートする方法
- バージョン確認でPythonだけ表示される原因と対処法
- 【Python】リスト(list)の括弧を外す方法
- 【Python】時間計測をミリ秒単位で実装する方法