Python 3.11から追加された標準パッケージtomllibの紹介
2023年01月23日 月曜日
CONTENTS
はじめに
私は、業務でマルウェア解析のようなリバースエンジニアリングをしており、業務効率化のために自作ツールを作ることがあります。皆さんは自作のツールの設定ファイルに、どのようなファイル形式を利用していますか。昨今は、KubernetesやAnsibleなどで用いられるYAMLや、フロントエンド界隈で頻繁に利用されるJSONなどが多い印象です。そんな中、今回はTOMLと呼ばれるファイル形式の紹介をします。プログラミング言語Rustのパッケージ管理ファイルに利用されていたり、徐々に目にする機会が増えてきた気がします。そのTOMLが、Python 3.11から標準ライブラリtomllibを用いて扱うことができるようになりました。本記事では、TOMLの簡単な紹介とtomllibの使い方を紹介します。
TOMLの紹介
TOML(Tom’s Obvious Minimal Language)とは、人間にとって読みやすいように設計された設定ファイルに活用できる形式です。TOMLは、公式サイトで下記のように説明されています。
TOML aims to be a minimal configuration file format that’s easy to read due to obvious semantics. TOML is designed to map unambiguously to a hash table. TOML should be easy to parse into data structures in a wide variety of languages.
他のファイルフォーマットと同様に、さまざまなデータ型を備えています。公式サイトに記載されているサンプルは下記の通りです。Windowsでよく用いられるINI形式と似ており、それを拡張したような印象を持つでしょう。
# This is a TOML document title = "TOML Example" [owner] name = "Tom Preston-Werner" dob = 1979-05-27T07:32:00-08:00 [database] enabled = true ports = [ 8000, 8001, 8002 ] data = [ ["delta", "phi"], [3.14] ] temp_targets = { cpu = 79.5, case = 72.0 } [servers] [servers.alpha] ip = "10.0.0.1" role = "frontend" [servers.beta] ip = "10.0.0.2" role = "backend"
他のファイル形式と比べたTOMLの特徴としては、下記のようなものがあげられます。
- 構造化データの記述には、「.(ドット)」や「[](角括弧)」を利用する
- YAMLと異なり、階層が深くなることがない(インデントも可)
- 階層が深くことによる、インデントずれなどのエラーからの解放
- JSONと異なり、コメント機能を有する
tomllibの使い方
冒頭にお話しした通り、Python 3.11からtomllibというパッケージが、標準ライブラリ入りしました。本パッケージが、入ったことにより、3rd-partyなパッケージを用いてTOMLを扱わなくて済むようになったことは、運用やセキュリティ面から助かることでしょう。最近のPythonでは、パッケージ管理に「pyproject.toml」と呼ばれる設定ファイルを使用することもできるため、PythonにおけるTOMLの重要性が高まってきた結果、標準ライブラリに入ったと考えられます。
では、tomllibの実際の使い方を紹介します。と、言っても、本パッケージで提供されているメソッドは、2つのみです。Pythonの標準のjsonパッケージと同一のインタフェースなため迷うこともないでしょう。ちなみに、jsonパッケージと異なり、TOMLを出力するメソッドなどは、存在しないようです。TOMLの仕様では、インデントを含めるか含めないかなどもユーザにゆだねられており、他の形式に比べて、自由度があるため、書き出すメソッドが用意されていないのではないかと考えられます。
tomllib.loads
tomllib.loadsメソッドでは、TOML形式の文字列を渡して、Dict型のデータとして返します。
import tomllib toml: str = """[mytool] username = "johndoe" api_key = "THIS_IS_A_DUMMY_API_KEY" endpoint = "https://example.com/api/v1/" """ config = tomllib.loads(toml))
tomllib.load
tomllib.loadメソッドでは、File Objectを渡して、Dict型のデータとして返します。1つ注意点として、バイナリファイルを読み込むように、「rb」を指定して、ファイルを開く必要があるようです。これをしないと、例外が発生します。
import tomllib path = 'config.toml' with open(path, 'rb') as fin: config = tomllib.load(fin)
おわりに
本記事では、TOMLの紹介とPython 3.11から標準ライブラリ入りしたtomllibの使い方を紹介しました。私の考えでは、TOMLに対応する言語やプロダクトなどはより増えていくと考えています。TOMLは、他のファイル形式にはない利点があるため、ぜひファイル形式選定の際には、候補として考えてみてください。