DotMapを使ってdictにドット"."でアクセスする
tomlから設定を読み込むとき、いちいちdict["key"]
のようにアクセスするのが面倒になってきた。
dict.key
のようにアクセスしたいなあと思ってググってたら、DotMapという、まさにその機能を実現するパッケージがあったのでメモしておく。
使い方の説明は以下の公式ページや、Qiitaに譲る(丸投げともいう)。
なお、condaだと旧バージョンしかインストールできなかったので、pipからインストールした方がよいと思われる。
自分はcondaを使っているのでpip install dotmap --no-deps
として、余計なパッケージが入らないようにpipからインストールした。
公式
日本語解説 @ Qiita
以下、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
予約語の出力は、以下の記事を参考にした。