2017-05-22 14 views
1

クラスの計算メソッド内で呼び出す必要のある関数を指定するjsonファイルがあります。python:設定ファイルで指定された関数のセットを呼び出す

このようなJSONファイルを見て:

{"function_definition": ["function_1","function_2","function_3"]} 

が、私は次のように私のクラスの__init__方法でこのファイルをお読みください。

def __init__(self,filename): 
    with open(filename) as f: 
     variables = json.load(f) 
    for key, value in variables.items(): 
       setattr(self, key, value) 

は今、私はcomputeメソッド内でこれらの関数を呼び出す必要があります。 私はこのように実行しようとしました:

def function_1(self,parameter): 
    function_1 = 1*parameter 
    return function_1 

def function_2(self,parameter): 
    function_2 = 2*parameter 
    return function_2 

def function_3(self,parameter): 
    function_3 = 3*parameter 
    return function_3 

def compute(self,parameter): 

    output_function= {} 
    for index_function in range(0,len(self.function_definition)): 
     output_function[self.function_definition[index_feature]] = 
     self.features_to_compute[index_feature](parameter) 

が、私は得る:

TypeError: 'unicode' object is not callable 

文字列として私のconfファイルで指定された関数を呼び出すための正しい方法は何ですか?

+3

'self.features_to_computeは[index_feature]'関数自体を返された(そしてそれがJSONファイルであるとして、それはそれは、関数の名前を返していません。)場合であっても、機能しています*定義*? – DeepSpace

+0

ここでは設計上の問題は解決していますが、関数はどこに定義されていますか?同じモジュールですか?別のモジュールですか?後者の場合、モジュールはすでにインポートされていますか? – timgeb

+1

@timegeb、私は私の質問を編集しました...関数は同じクラスのメソッドとして定義されています... – gabboshow

答えて

1

ここでは設計上の問題を残して、getattrを探しています。これを使用して、オブジェクトの属性(場合によってはメソッド)を名前で取得できます。その後、戻り値はgetattrです。

デモ:

>>> class foo(object): 
...  def __init__(self): 
...   self.function_definition = ['function1', 'function2'] 
...  def function1(self): 
...   print('hi') 
...  def function2(self): 
...   print('bye') 
...  def compute(self): 
...   for fname in self.function_definition: 
...    getattr(self, fname)() 
... 
>>> foo().compute() 
hi 
bye 
+0

ありがとう!デザインの提案はありますか? :)私のデザインに何か問題があるかどうか分かりませんでした。 – gabboshow

+0

私はあなたのコードについて、あまりにも少し知っています。*時には関数/メソッドを名前で呼び出すのが最も簡単な解決策です。悪い。しかし、 '__init__'メソッドを見ると、JSONを使ってオブジェクト全体を保存して復元しようとしているようです。あなたは 'pickle'のようなより直接的なアプローチを検討しましたか? – timgeb

関連する問題