2016-11-03 5 views
0

これは私のコードではありませんが、私は同様の問題があります:私は編集して変更します(可能な限り最もセマンティックな方法で)1中心的な場所にして、構築するために使用する多くのパラメータがありますPythonのいくつかのクラスや関数に多くのデフォルト値を指定する方法は?

https://gist.github.com/songrotek/0c64d10cab5298c63cd0fc004a94ba1f

をクラスは、メインプログラムなどを実行します。 私は1つのファイル(それは大きすぎます、私はモジュールと異なる名前空間が必要)とグローバル変数を宣言するすべてのものを入れたくないので。 いくつかのパラメータを設定するためのコードを編集するのは良い解決策ではないようです。

class Example: 
    def __init__(self, *initial_data, **kwargs): 
     for dictionary in initial_data: 
      for key in dictionary: 
       setattr(self, key, dictionary[key]) 
     for key in kwargs: 
      setattr(self, key, kwargs[key]) 

initの辞書を使用できるようなコンストラクタを使用すると、十分に透過的ではないようです。

この問題の解決方法を教えてください。それはまだ私が主に使用しているコードで、かなり小さいので、軽量/サイズに適していて、使いやすく快適なものです。

+0

あなたは '** kwargs'に辞書を渡すことができます。例えば、あなたの辞書が 'd'と呼ばれていたら、' ** d'を渡すことができます。それはあなたが意味することですか? – cdarke

+0

あなたの懸念を正しく理解しているかどうかは不明ですが、ここで議論されていることの方向に向かいますか:[http://stackoverflow.com/questions/6198372/most-pythonic-way-to-provide-global-configuration- variables-in-config-py] –

答えて

0

これを処理する一般的な方法は、ConfigParserによって読み取られている構成ファイルです。ここで

は一例です:

# configuration.ini 
[Example1] 

constant1: 1 
constant2: 2 

[Example2] 

c1: 'one' 
c2: 'two' 

# test.py 
from ConfigParser import ConfigParser 

conf = ConfigParser() 
conf.read('configuration.ini') 

def configure_instance(instance): 
    for i in conf.items(type(instance).__name__): 
     setattr(instance, i[0], i[1]) 

class Example1(object): 
    def __init__(self): 
     configure_instance(self) 

class Example2(object): 
    def __init__(self): 
     configure_instance(self) 


e1 = Example1() 
e2 = Example2() 
print vars(e1) 
print vars(e2) 

# {'constant1': '1', 'constant2': '2'} 
# {'c2': "'two'", 'c1': "'one'"} 
+0

ini-fileアプローチでは、すべての変数が文字列であるという欠点があります。変数の型を自動検出するYAML(http://pyyaml.org/wiki/PyYAML)に切り替えることができます。 – hvwaldow

関連する問題