2016-10-12 3 views
1

main_config.pycustom_config.pyというファイルがあるとします。それらは同じモジュール内にあります。私が何をしたいか他のファイルに格納されている変数でPythonが設定ファイルを上書きする

は2つのそれらの一つは、(メイン)のバージョンが制御されている別の設定ファイル、および他の1(カスタム)を持っている.gitignoreは異なる設定がmainファイルと、自分のコンフィグを持ってできるように、D」でありますテンプレートとして使用されます。

コードはPython 3.5で正しく動作するために使用されていましたが、2.7に戻す必要があり、もはや期待どおりに動作しません。私は間違って何をしていますか?私はKeyError: 'client2'の例外をexecとしています。 main_config.py

内容:custom_config.py

class MainConfig(object): 
    clients = { 
     "client1" = { 
      "IP" = "127.0.0.1", 
      "User" = "admin" 
     } 
    } 

    try: 
     with(open(__file__.replace("main_config.py", "custom_config.py")) as source_file: 
      exec(source_file.read()) 
    except IOError, e: 
     print("No custom config detected") 

内容:

from (...).main_config import MainConfig 

MainConfig.clients["client2"]["IP"] = "0.0.0.0" 
MainConfig.clients["client2"]["User"] = "root" 

答えて

1

私はあなたが辞書、代わりに:=記号を使用参照してください。それはさておき

、あなたはそれがそうあなたのコードは次のようになります前に、割り当てられたclient2なしIPを割り当てることができません。

main_config.py

class MainConfig(object): 
    clients = { 
     "client1" : { 
      "IP" : "127.0.0.1", 
      "User" : "admin" 
     } 
    } 

    try: 
     with(open(__file__.replace("main_config.py", "custom_config.py")) as source_file: 
      exec(source_file.read()) 
    except IOError, e: 
     print("No custom config detected") 

custom_config.py

from (...).main_config import MainConfig 

if 'client2' not in MainConfig.clients.keys(): 
    MainConfig.clients["client2"] = {} 
MainConfig.clients["client2"]["IP"] = "0.0.0.0" 
MainConfig.clients["client2"]["User"] = "root" 
+0

あなたが気づいた ':'と '='に関して、それはタイプミスです。答えの残りの部分については、このトリックを行う必要がありますが、なぜ私はこの 'if'節なしで他のファイルからキーを作ることができないのか分からない - 結局のところ、私のファイルが分割されていなければ、キーが存在するかどうか最初にチェックすることなく、この種のキー作成を使用できます。なぜPython 3.5で動くのですか? – Asunez

1

私は説明していませんよあなたが遭遇する特定のエラーを解決する方法(他の回答は既にそれをしています)が、私は あなたのユースケースに適した設定言語があることを指摘してください。具体的には、Figura は、この種のオーバーライド機能をネイティブにサポートしています。ここで

は例です:

# main_config.py 
class MainConfig: 
    class clients: 
     class client1: 
      IP = "127.0.0.1" 
      User = "admin" 

# custom_config.py 
class CustomConfig: 
    # declare this config is meant to be applied as an override to another 
    __override__ = True 
    class client2: 
     IP = "0.0.0.0" 
     User = "root" 

そして、あなたのコードでそれらを組み合わせる:

from figura import build_config 
full_config = build_config('main_config.MainConfig', 'custom_config.CustomConfig') 

オーバーライドを適用するような柔軟なbuild_config機能は、基本設定として、第1引数、および残りを扱いますそれ。

完全開示:私はfiguraの著者です。

+0

この問題に関するもう一つのアプローチがアップしましたが、残念ながら他のモジュールを使用することはできません。 – Asunez

関連する問題