われがわログ

最適化アルゴリズムとかプログラミングについて書きたい

DotMapを使ってdictにドット"."でアクセスする

tomlから設定を読み込むとき、いちいちdict["key"]のようにアクセスするのが面倒になってきた。 dict.keyのようにアクセスしたいなあと思ってググってたら、DotMapという、まさにその機能を実現するパッケージがあったのでメモしておく。

使い方の説明は以下の公式ページや、Qiitaに譲る(丸投げともいう)。 なお、condaだと旧バージョンしかインストールできなかったので、pipからインストールした方がよいと思われる。 自分はcondaを使っているのでpip install dotmap --no-depsとして、余計なパッケージが入らないようにpipからインストールした。

公式

github.com

日本語解説 @ Qiita

qiita.com

以下、tomlとDotMapを組み合わせた例を示しておく。

toml形式のパラメータファイル(./parameter/nominal.toml):

[universal]
description = "ノミナルケース"
max_timestep = 3

[local]
time = 10

Python側:

import toml
from dotmap import DotMap

params_dict = toml.load("./parameter/nominal.toml")

# dictのままだと記述が冗長
print(params_dict["universal"]["description"])
# 存在しないキーにアクセスしたときエラーを出すようにしておく
params = DotMap(params_dict, _dynamic=False)

# DotMapを使うと簡潔に描ける
print(params.universal.description)
print(params.universal.max_timestep)
print(params.local.time)

ちなみに、tomlでglobalという名前のkeyを作ると、DotMapでアクセスするときにエラーを吐くので注意。 10分くらいハマった。 globalが予約語であることに起因すると思われる。 Python3.8では予約語は以下の通りである。

False
None
True
and
as
assert
async
await
break
class
continue
def
del
elif
else
except
finally
for
from
global
if
import
in
is
lambda
nonlocal
not
or
pass
raise
return
try
while
with
yield

予約語の出力は、以下の記事を参考にした。

Python:予約語の一覧を確認する方法 | もためも