1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonで SimpleNamespace を使って辞書の値を属性アクセスできるようにする

Posted at

この記事は何?

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?