Python 3.11から追加された標準パッケージtomllibの紹介

2023年01月23日 月曜日


【この記事を書いた人】
ちひろ

2018年新卒入社し、SOCにてインフラ管理を担当。その後、マルウェア解析や検証業務などに従事。2022年度からは、社内のSREチームにて兼務を開始。主な保持資格は、CISSP, OSCP, GREM, GXPN, RISS, CKA, CKSなど。バイナリを読むのが好きで、一番好きな命令はx86の0x90(NOP命令)。

「Python 3.11から追加された標準パッケージtomllibの紹介」のイメージ

はじめに

私は、業務でマルウェア解析のようなリバースエンジニアリングをしており、業務効率化のために自作ツールを作ることがあります。皆さんは自作のツールの設定ファイルに、どのようなファイル形式を利用していますか。昨今は、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は、他のファイル形式にはない利点があるため、ぜひファイル形式選定の際には、候補として考えてみてください。

ちひろ

2023年01月23日 月曜日

2018年新卒入社し、SOCにてインフラ管理を担当。その後、マルウェア解析や検証業務などに従事。2022年度からは、社内のSREチームにて兼務を開始。主な保持資格は、CISSP, OSCP, GREM, GXPN, RISS, CKA, CKSなど。バイナリを読むのが好きで、一番好きな命令はx86の0x90(NOP命令)。

Related
関連記事