この記事は何?
Pythonで SimpleNamespace を使って、辞書の値に属性アクセス(.属性名)できるようにする方法を紹介します。
Pythonの辞書について
Pythonで辞書の値にアクセスする際には dict['key']
のように文字列のキーを使用する必要があります。これは時に不便であり、コードの読みやすさを損なうことがあります。
SimpleNamespaceを使うと、辞書の値に属性アクセス (.属性名)
できるようになります。
SimpleNamespace とは
SimpleNamespace は、Pythonの標準ライブラリ types に含まれるクラスで、属性へのアクセスを容易にするためのものです。このクラスを使うと、辞書のキーをオブジェクトの属性としてアクセスできるようになります。
サンプルコード
辞書を SimpleNamespace に変換する関数
from types import SimpleNamespace
def convert_nested_dict_to_namespace(data):
"""
再帰的に辞書を SimpleNamespace に変換する。
Args:
data: 辞書またはその他のデータ型
Returns:
変換された SimpleNamespace オブジェクトまたは元のデータ
"""
if isinstance(data, dict):
for key, value in data.items():
data[key] = convert_nested_dict_to_namespace(value)
return SimpleNamespace(**data)
else:
return data
この関数は、入力されたデータが辞書型であるかどうかをチェックします。辞書であれば、その各キーと値に対して再帰的にこの関数を適用し、最終的に SimpleNamespace オブジェクトを返します。
YAML形式の設定ファイルを読み込む例
指定されたYAMLファイルを読み込み、辞書に変換する例です。
convert_nested_dict_to_namespace
関数を使用して、この辞書を SimpleNamespace
オブジェクトに変換します。
YAMLファイル
database:
host: localhost
port: 5432
コード
import yaml
def load_config(yaml_file_path):
"""
yaml config読み込み
Args:
yaml_file_path (str): ファイルパス
Returns:
SimpleNamespace: 設定値が属性としてアクセス可能なオブジェクト。
"""
with open(yaml_file_path, "r") as file:
config_dict = yaml.safe_load(file)
config = convert_nested_dict_to_namespace(config_dict)
return config
config = load_config('path/to/config.yaml')
print(config.database.host) # localhost
print(config.database.port) # 5432
最後に
もうちょっと複雑なことをしたい時は, OmegaConf を使うといいと思います。
https://github.com/omry/omegaconf