きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Pythonで設定ファイルを読み込む処理をラップしてクラスとして扱うと便利

普段Javaで使っている感覚と同じように、Pythonでもプロパティファイルを扱いたかったため、調べた記事です。

環境

  • Python
    • 3.8.10

ゴール

  1. 設定ファイル(.ini)をコード内で読み込めるようにする
  2. 読み込んだ設定ファイルを他クラスからも簡単に扱えるようにする

対応

設定ファイル(.ini)を準備する

設定ファイルを準備します。config.iniという名前の設定ファイルにし、usernamepasswordの2つの変数を持たせます。

[DEFAULT]
username=default_user
password=default_pass

設定ファイル(.ini)をPythonで読み込む

標準ライブラリのconfigparserを使用します。事前に設定しておいたconfig.iniファイルから、usernamepasswordを読み込みます。

import configparser

# 設定ファイルを読み込む準備
config_ini = configparser.ConfigParser()
config_ini.read('config.ini', encoding='utf-8')

# セクションを指定して読み込む
config = config_ini['default']

# getメソッドで変数を読み込む
username = config.get('username')
password = config.get('password')

# ファイルが読み込めていることを標準出力に出力する
print(f"username='{props.username}', password='{props.password}'")
# 「username=default_user, password=default_pass」と出力される

読み込み処理をラップしたクラスを作成する

読み込む処理をラップしているTestPropertiesクラスを作成します。そして、各変数のgetterを作成します。また、変数であることをマークするために@propertyをgetterに付与します。

import configparser

class TestProperties:
    def __init__(self):
        config_ini = configparser.ConfigParser()
        config_ini.read('config.ini', encoding='utf-8')

        self.config = config_ini['default']

    @property
    def username(self):
        return self.config.get('username')

    @property
    def password(self):
        return self.config.get('password')

この状態にしておくことで、TestPropertiesのインスタンスを作成するだけで設定ファイル(.ini)から値を取得しつつ、簡単に変数にアクセスできます。

from TestProperties import TestProperties
props = TestProperties()

print(f"username='{props.username}', password='{props.password}'")

ソースコード

※ 記事にはまとめていませんが、pytestで各テストメソッドにDIできるようにpytest.fixtureを使用しています。

終わりに

思い付くことができれば簡単な話ではありますが、処理をラップしてクラスにすることを考えていなかったせいで、各クラスで毎回設定ファイルを読み込む処理を書いていました。処理自体は特殊なことをしていないのでコピー&ペーストで書けるとはいえ、毎回10行前後の処理が挿入されるので可読性が悪いと感じてはいました。ラップするだけで全部解決できるのは非常によいですね。

Pythonistからするとレベルの低いことをしているとは思いますが、こういう地道なところから改善していろんな言語でも可読性を上げられるようにしたいです。


この記事お役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。

参考記事