🐍

【Python】辞書/JSONで定数を管理する

2021/06/26に公開

マジックナンバーは定数化して管理するのが定石ですが、
定数が増えてくると管理が大変です。

そこで辞書を使って管理するためのTIPSを紹介します。

※ 記載しているIDは生成したダミーデータです。

定数を並べる

例えばこんな感じ。
明らかに関係のある定数も別々で定義している状態。

ID_USER_DEVELOPER = 637830961515091929
ID_CHANNEL_LOGIN = 635343748595645529
ID_CHANNEL_DEBUG = 201164310260256715
ID_CHANNEL_QUESTION = 130682891339737632
ID_CATEGORY_MUSICBOT = 701397109218154247
ID_CATEGORY_ISSUES = 755990327092537255
ID_CATEGORY_CLOSED = 772300922722547208
ID_GUILD_BOT = 704012177034641692

この場合は使いたい場所に定数名をそのまま書くだけですね。

辞書の導入

上記の例をアンダーバー区切りで辞書に入れてみます。

ID = {
    'user': {
        'developer': 637830961515091929,
    },
    'channel': {
        'login': 635343748595645529,
        'debug': 201164310260256715,
        'question': 130682891339737632,
    },
    'category': {
        'musicbot': 701397109218154247,
        'issues': 755990327092537255,
        'closed': 772300922722547208,
    },
    'guild': {
        'bot': 704012177034641692,
    },
}

分類が見やすくなりましたね。
この場合の要素の取得方法は以下の2パターンです。

ID['channel']['login']
ID.get('channel').get('login')

因みに指定を間違えた場合、
上ではKeyError例外が返り、下ではNoneが返ります。
Pythonの辞書のgetメソッドでキーから値を取得(存在しないキーでもOK) | note.nkmk.me

attrdictの導入

辞書をそのまま使うと、括弧とかクォーテーションを書くのが面倒なので、
attrdict というパッケージを導入します。

from attrdict import AttrDict

# 上で定義したID辞書をAttrDictに渡す
ID = AttrDict(ID) 

# 要素の取得
ID.channel.login

これで記述がスッキリしました。

JSONで扱う

辞書が膨れ上がると、
JSONファイルに書き出して使いたくなると思います。

とりあえず書き出しと読み込みは以下のような関数で処理します。

import json

def input_json(filename):
    with open(filename, 'r') as f:
        return json.load(f)

def output_json(filename, obj):
    with open(filename, 'w') as f:
        json.dump(obj, f, indent=4, ensure_ascii=False)

そしてJSONファイルを使うと全体的にこんな感じになると思います。

from attrdict import AttrDict 
ID = input_json('id.json')
ID = AttrDict(ID)
print(ID.channel.login) # >> 635343748595645529

これで定数を自由自在に扱えますね!

Discussion