設定の意味をコメントで残したいのに、JSONへコメントを書くと読み込みが止まる場合は、TOMLも選択肢になります。TOMLは表やコメントを持てる設定ファイルの形式です。Python 3.11以降なら、標準ライブラリのtomllibで読めます。
ただし、読めた設定がそのツールに合うとは限りません。形式の解析と、必要な項目・型・範囲の検査を分けることで、誤設定を処理の開始前に返せます。
コメント付きの設定を読んで検査
次は入力パスと、一度に処理する上限を持つ架空の設定です。実ファイルは作らず、文字列をUTF-8のバイト列へしてtomllib.loadへ渡します。
from io import BytesIO
import tomllib
text = """
[paths]
input = "data/input.csv"
[run]
limit = 100 # 一度に扱う上限
"""
def read_settings(data):
config = tomllib.load(BytesIO(data.encode("utf-8")))
limit = config.get("run", {}).get("limit")
path = config.get("paths", {}).get("input")
if type(limit) is not int or not 1 <= limit <= 1000:
raise ValueError("limitは1から1000の整数です")
if not isinstance(path, str) or not path.strip():
raise ValueError("inputを指定してください")
return path, limit
path, limit = read_settings(text)
print("上限:", limit)
print("入力:", path)
rejected = 0
for wrong in ["0", "true", '"100"']:
try:
read_settings(text.replace("limit = 100", "limit = " + wrong))
except ValueError:
rejected += 1
print("不正値を拒否:", rejected)
assert (path, limit) == ("data/input.csv", 100)
assert rejected == 3
正常な上限100が読め、0、真偽値true、文字列の100は拒否されます。Windows・Python 3.12.10で、この解析と検査を確認しました。実際のCSVを読み込んだり、入力パスの存在を確認したりする処理は含んでいません。
実ファイルを読む場合は、rbモードで開いたファイルをtomllib.loadへ渡します。文字列から直接読むtomllib.loadsとは、受け取るものが違います。
trueを整数として通さない
Pythonのboolはintの一種として扱われるため、isinstance(limit, int)だけで判定するとtrueも通ることがあります。整数だけを許す例ではtype(limit) is intで分けています。
上限の1から1000もこの架空ツールの条件です。TOML全体の制限ではありません。別のツールへ使う場合は、実際に処理できる範囲と、設定の単位を決めてください。
構造が違う設定や項目の不足も、設定を受け取る処理でも確認する必要があります。読み込みエラーを空の辞書へ置き換えて続けると、設定を読み込めなかったのか、既定値で動かしたのか分かりにくくなります。
設定を読んでも書き戻せない
tomllibは解析用で、TOMLを書き出すAPIは持ちません。ファイルへ設定を保存する画面や自動更新が必要なら、その工程は別に考えます。コメントを保ったまま書き戻せるかも、読む機能とは別の条件です。
また、設定ファイルを分けただけでAPIキーが安全になるわけではありません。共有する見本には架空の値だけを置き、実際の秘密や個人情報を含めないようにします。
最初は小さな設定を読み、必要な値を検査して表示するところまで試してください。処理対象のパスや実行回数が正しいと確かめてから、実データを扱う処理へつなげます。
形式の違いはJSONの読み方と保存、秘密をコードから分ける考え方は環境変数の基本で補えます。
参考資料
Python tomllib公式資料を2026年11月1日に確認しました。
