Pythonプロンプトで設定ファイル(configファイル)が必要になるときがありますね。
設定ファイルはいろいろな書き方がありますが、それらの種類ごとに書き方の例、使い方の例、主観のメリット、デメリットをまとめます。
Pythonスクリプト
書き方の例
config.py
DEBUG = True
TEMPLATE_DEBUG = DEBUG # DEBUG変数に依存した設定も可能
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'my_db',
'USER': 'db_user',
},
'staging': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'staging_db',
'USER': 'staging_user',
}
}
使い方の例
# main_app.py の例
import config
from pprint import pprint
import os
print(f"デバッグモード: {config.DEBUG}")
# 環境変数PYSCHOOL_DATABASEに応じてデータベース設定を切り替える例
env = os.environ.get('PYSCHOOL_DATABASE', 'default')
print(f"現在の環境: \"{env}\"")
if env in config.DATABASES:
pprint(config.DATABASES[env])
else:
print('データベース設定の環境が不明です。')
メリット
- 読み書きが簡単
- 変数や構造を使ったリッチな書き方ができる
- IDEで補完してくれる
デメリット
- プログラムが書けてしまうのでセキュリティリスクあり
- プログラムと設定の境界があいまいになる
- Python以外の言語で読むのが困難
INIファイル
書き方の例
config.ini
ServerAliveInterval = 45
Compression = yes
ForwardX11 = yes
[my_app]
database_host = localhost
database_port = 5432
使い方の例
import configparser
config = configparser.ConfigParser()
config.read('config.ini')
print(f"データベースホスト: {config['my_app']['database_host']}") # 'localhost'
print(f"デフォルトの圧縮設定: {config['Compression']}") # 'yes'
print(f"my_appの圧縮設定 (DEFAULTから継承): {config['my_app'].getboolean('Compression')}") # True
メリット
- シンプル
- 標準ライブラリ(
configparser
)で使える
デメリット
- 古くて書いている人を見るのはまれ
- 型の扱いが困難
- データ構造の表現が困難
JSONファイル
書き方の例
config.json
{
"theme": "dark",
"user_settings": {
"font_size": 12,
"language": "en"
}
}
使い方の例
import json
with open('config.json', 'r') as f:
loaded_config = json.load(f)
print(f"フォントサイズ: {loaded_config['user_settings']['font_size']}") # 12
メリット
- 利用されているシーンが多い
- データ構造の読み書きしやすい
- 標準ライブラリ(
json
)で使える
デメリット
- コメントが書けない & コメントアウトできない
YAMLファイル
書き方の例
config.yaml
server:
# ホスト
host: 0.0.0.0
# ポート
port: 8080
users:
- user1
- user2
- user3
使い方の例
import yaml
with open('server_config.yaml', 'r') as file:
loaded_config = yaml.safe_load(file)
print(f"サーバーポート: {loaded_config['server']['port']}") # 8080
メリット
- データ構造の読み書きしやすい
- コメントが書ける
デメリット
- 外部ライブラリ(
PyYAML
)が必要
TOMLファイル
書き方の例
config.toml
# config.toml の例
title = "My Awesome App"
[database]
type = "PostgreSQL"
host = "localhost"
port = 5432
enabled = true
[[users]] # リストのテーブル(配列の要素がテーブルの場合)
name = "Alice"
id = 1
email = "alice@example.com"
[[users]]
name = "Bob"
id = 2
email = "bob@example.com"
使い方の例
import tomllib # Python 3.11+
# import tomli # Python 3.10以前
# 読み込みの例
with open('config.toml', 'rb') as f: # TOMLファイルはバイナリモードで開く
config = tomllib.load(f) # または tomli.load(f)
print(f"アプリケーションタイトル: {config['title']}") # My Awesome App
print(f"データベースポート: {config['database']['port']}") # 5432
メリット
- シンプルで読み書きしやすい
- データ型が明確
- コメントが書ける
- Python3.11以降は標準ライブラリ(
tomllib
)で使える
デメリット
- 新しくて使っている人がまだ少ない
まとめ
これから書くならYAMLかTOMLが良いんですかね。