設定ファイルを.ini等でなく、設定ファイルもPythonで書いて与える形を試行してみます。
Pythonで書いて与える設定ファイルは、「config(cfg)」関数の中に設定を書いて、「cfg」オブジェクトに設定値を代入することにすると、以下「trial-config1.py」のようなもの(例)。
関数の戻り値や、場合分けして設定可能。別の設定ファイルを読み込んで上書き(ネスト)も可能。
trial-config1.py (設定ファイル)
# -*- coding: utf-8 -*-
# pyによる設定ファイル
import socket
# sec: config
def config(cfg):
# sec: cfgに設定値を代入する形
cfg.setting1 = True
# sec: 関数戻り値を設定可
cfg.name = socket.gethostname() # ホスト名 (★関数戻り値を設定可)
cfg.ip = socket.gethostbyname(cfg.name) # IPアドレス
# sec: 場合分けして設定可
if "PC" in cfg.name: # (★場合分けして設定可)
cfg.setting2 = True
# sec: 階層的に設定可
cfg.setting3 = cfg.__class__() # (★階層的に設定可)
cfg.setting3.setting1 = True
# sec: 設定ファイルのネスト可
__import__("trial-config2").config(cfg) # (★設定ファイルのネスト可)
別の設定ファイルも、「config(cfg)」関数と「cfg」オブジェクトを使う形にして、以下「trial-config2.py」のようなもの(例)。
trial-config2.py (設定ファイル)
# -*- coding: utf-8 -*-
# pyによる設定ファイル
# sec: config
def config(cfg):
# sec: 元の設定値を上書き
cfg.name += " + 上書き"
cfg.ip += " + 上書き"
# sec: 新しい設定値を代入
cfg.setting11 = True
「trial-config1.py」と「trial-config2.py」は、以下のように置く時、
ファイル構造
アプリ側スクリプト.py
trial-config/
trial-config1.py (設定ファイル)
trial-config2.py (設定ファイル)
アプリ側で、前記のPythonで書いた設定ファイルを読み込んで利用するには、「import("trial-config1").config(cfg)」等で読み込み、「cfg」の中の各値を用いる形にして、以下コード。
アプリ側スクリプト.py
# -*- coding: utf-8 -*-
# pyで設定定義ファイルを構成・ネストする方法
import sys
# sec: main
def main():
# sec: 格納クラス
class Config: pass
cfg = Config()
# sec: 読込
sys.path.append(r"./trial-config/")
__import__("trial-config1").config(cfg)
del sys.path[-1]
# sec: 結果表示
for key, val in cfg.__dict__.items():
print(f"{key}: {val}")
"""コンソール出力例:
setting1: True
name: PC1 + 上書き
ip: 192.168.0.1 + 上書き
setting2: True
setting3: <__main__.trail__py_config_file.<locals>.Config object at 0x0>
setting11: True
"""
# sec: entry
if __name__ == "__main__": main()
「cfg」内の設定値が全てコンソールに表示されます。アプリ側では「cfg.setting1」のようにして、設定値を利用可に。