普段Javaで使っている感覚と同じように、Pythonでもプロパティファイルを扱いたかったため、調べた記事です。
環境
- Python
- 3.8.10
ゴール
- 設定ファイル(.ini)をコード内で読み込めるようにする
- 読み込んだ設定ファイルを他クラスからも簡単に扱えるようにする
対応
設定ファイル(.ini)を準備する
設定ファイルを準備します。config.ini
という名前の設定ファイルにし、username
とpassword
の2つの変数を持たせます。
[DEFAULT] username=default_user password=default_pass
設定ファイル(.ini)をPythonで読み込む
標準ライブラリのconfigparser
を使用します。事前に設定しておいたconfig.ini
ファイルから、username
とpassword
を読み込みます。
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
を使用しています。
- https://github.com/hirotoKirimaru/playwright-practice/blob/ae2ff5119860373930795897f8f3c90aefa0404d/python/config.ini
- https://github.com/hirotoKirimaru/playwright-practice/blob/ae2ff5119860373930795897f8f3c90aefa0404d/python/conftest.py
- https://github.com/hirotoKirimaru/playwright-practice/blob/ae2ff5119860373930795897f8f3c90aefa0404d/python/test_sample_1.py
終わりに
思い付くことができれば簡単な話ではありますが、処理をラップしてクラスにすることを考えていなかったせいで、各クラスで毎回設定ファイルを読み込む処理を書いていました。処理自体は特殊なことをしていないのでコピー&ペーストで書けるとはいえ、毎回10行前後の処理が挿入されるので可読性が悪いと感じてはいました。ラップするだけで全部解決できるのは非常によいですね。
Pythonistからするとレベルの低いことをしているとは思いますが、こういう地道なところから改善していろんな言語でも可読性を上げられるようにしたいです。
この記事お役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。