同僚は、独自のファイルで定義されたハードコーディングされた構成を使用するライブラリを持っています。例えば:
定数.py:
API_URL="http://example.com/bogus"
ライブラリの残りの部分では、次の方法で構成にアクセスします。
from constants import API_URL
ご想像のとおり、これはあまり柔軟ではなく、テスト中に問題が発生します。構成を変更したい場合は、ソース コード管理にある constants.py を変更する必要があります。
当然のことながら、JSON または YAML ファイルから構成をロードしたいと思います。問題なく構成をオブジェクトに読み込むことができます。constants.py
コードを壊さずにモジュールをオーバーライドして、たとえば、各グローバルAPI_URL
がファイルによって提供される値に置き換えられるようにする方法はありますか?
私は、それぞれの後from constants import ...
に次のようなものを追加できると考えていました:
from constants import * # existing configuration import
import json
new_config = json.load(open('config.json')) # load my config file into a dictionary
constants.__dict__.update(new_config) # override any constants with what I've loaded
もちろん、これの問題は、あまり「DRY」ではなく、もろいように見えることです.
これをもっときれいにするための提案はありますか?ありがとう!
編集:とにかく私のアプローチがうまくいかないようです。「from import *」は、モジュールの値を現在のモジュールのグローバルスコープにコピーすると思いますか?
ダブル編集: いいえ、機能します。私はただ混乱しています。しかし、これを X 個の異なるファイルで行うのではなく、可能であれば透過的に動作させたいと考えています。