2017-09-23 11 views
0

ソフトウェアの使用に関連する一般的な設定を含むJSONファイルを開く必要があるコードを作成しています。これを構文解析して、値の一部を上書きする可能性があります。これらの設定は、設定を確認するために実行時に複数回アクセスする必要があります。設定ファイルを扱うためのデザイン

例:設定の1つは 'username'と 'password'です。存在しない場合はユーザーが入力する必要があります。別の設定は、「モードA」、「モードB」および「モードC」の可能な値を有する「ソフトウェアがどのように動作すべきか」に関する。

問題は私はプログラマーではなく、configsを管理するための良い設計を見つけることができません。 JSONファイルを開いて、必要なときに毎回書き直して保存するか、変数に解析して、この変数をメモリに保存してから(コードが実行される直前まで)保存してから保存してください最後のJSONファイル?

もう1つの質問は:私は変数に解析し、プログラムが終了するまでそれを保持することを好む場合はどうすればよいですか?この変数はいくつかの関数でアクセスする必要があるので、グローバル変数を使うべきだと思っていましたが、 "global"ステートメントを使ってグローバル変数に書き込むことは悪い習慣であり、混乱を招く可能性があります。例:

import json 
config_global = None 

def read_JSON_file(): 
    config_file = open(r'config_file.json') 
    global config_global 
    config_global = json.load(config_file) 
    config_file.close() 

def functionA(): 
    global config_global 
    # Do something with config_global 

def functionB(): 
    global config_global 
    # Do something with config_global 

def save_JSON_file() 
    config_file = open(r'config_file.json', 'w') 
    json.dump(config_global, config_file) 
    config_file.close() 

read_JSON_file() 
functionA() 
functionB() 
save_JSON_file() 

私も、私は関数呼び出しの間で設定変数の参照を渡すことができると思ったが、私はすべてのためにそれを渡す必要がありますので、それは、良い解決策になる場合、私は知りません機能、毎回:

import json 

def read_JSON_file() -> dict: 
    config_file = open(r'config_file.json') 
    config = json.load(config_file) 
    config_file.close() 
    return config 

def functionA(config: dict): 
    # Do something with config 

def functionB(config: dict): 
    # Do something with config 

def save_JSON_file(config: dict) 
    config_file = open(r'config_file.json', 'w') 
    json.dump(config, config_file) 
    config_file.close() 

parsed_config = read_JSON_file() 
functionA(parsed_config) 
functionB(parsed_config) 
save_JSON_file(parsed_config) 

はまた、私は完全にそれがどのように機能するかを理解していない、またはそれは良い解決策になる場合はシングルトンの使用に関連したものを、読みました。

最終的に、私はこれにどのような良い解決策があるのか​​を知りたいと思います。私の実装で直面する可能性のある問題を表示して、より良いソリューションを提案するように自由に落ちました。

ご協力いただきありがとうございます。

+0

私はプログラマであり、私は構成を管理するための良い設計を理解できません。 – evilSnobu

答えて

0

私は構成をモジュールにします。これは、importモジュールを必要とするスクリプトの全体または一部にすることができます。モジュールは本質的にシングルトンであり、最初にロードされたときにsys.modulesにキャッシュされ、それ以降の再試行があるとそのエントリが使用されます。そのため、毎回実際に読み取られて実行されるオーバーヘッドが発生しません。

設定モジュールの本体で、jsonファイル内の情報を開いて読み込むことができます。この情報は、さまざまな形で利用できるようになりました。

もちろん、あなたが望む機能をモジュールに追加することもできます。もちろん、あなたはモジュールに追加することもできます。たとえば、最初にインポートされたときに自動的に実行するのではなく、その中に含まれている値が使用可能になる前に呼び出される特別な関数が必要な場合があります。

つまり、問題を処理するのに非常に柔軟な方法です。それが拡張可能なので、多くのカスタマイズが可能です。

+0

OKだから、 "config_global"というグローバル変数を含む新しいモジュールがあります。これはjson.load()によって返されるdictの値を持っていますか?その後、私が設定にアクセスする必要があるとき、私はこの新しいモジュールをインポートし、それを "config_global"変数にします。しかし、config_global変数の設定を上書きする必要がある場合、グローバルに書き込むことはできません(他のモジュールの内部にあっても)。 –

+0

モジュール 'config.py'に名前をつけて、' config_global'という名前のモジュールレベルの変数(jsonファイルを読み込むことによって生成された)を定義していると仮定して、 'config config_global'をインポートできます。 'config_global'の内容を変更した場合、それらはメモリに残り、それを' import 'している他のスクリプトにも見えます。現在のコンテンツを元のファイルに書き戻す機能をモジュールに追加することができます。その機能は、あなたがそれを扱うためのAPIを定義することができるため、どのように動作させるのかによって異なりますフィットを参照してください。 – martineau

+0

OK、私はそれを得ました。それは良い解決策のようですが、私はまだ質問があります。 "config.py"モジュールでは、 "config_global"はグローバル(モジュールレベル)変数です。ですから、最初にjsonファイルを読み込んだときや、実行時に設定を変更したときに書き込むと、基本的にはグローバルに書き込むことになります。それはまだ悪い習慣とみなされないでしょうか(なぜなら、グローバルへの書き込みは通常、悪い習慣とみなされるからです)。 –

関連する問題