2017-05-22 3 views
1

Ich habe eine JSON-Datei, wo ich einige Funktionen angeben, die innerhalb der Compute-Methode einer Klasse aufgerufen werden müssen.Python: Aufruf einer Reihe von Funktionen in einer Konfigurationsdatei angegeben

Die JSON-Datei sieht wie folgt aus:

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

las ich diese Datei im __init__ Methode meiner Klasse wie folgt:

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

Jetzt muss ich diese Funktionen innerhalb des compute Methode aufrufen . Ich habe versucht, wie dies zu tun:

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) 

aber ich bekomme:

TypeError: 'unicode' object is not callable 

Was ist der richtige Weg, um eine Funktion in meiner conf Datei als String angegeben anrufen?

+3

Auch wenn 'self.features_to_compute [index_feature]' die Funktion zurück selbst (und es nicht den Namen der Funktion gibt, wie es in der JSON-Datei ist.), Wo Funktionen * definiert *? – DeepSpace

+0

Lassen Sie das Designproblem hier beiseite, wo sind die Funktionen definiert? Im selben Modul? In einem anderen Modul? In letzterem Fall ist das Modul bereits importiert? – timgeb

+1

@timegeb, Ich habe meine Frage bearbeitet ... die Funktionen sind als Methoden der gleichen Klasse definiert ... – gabboshow

Antwort

1

Lassen Sie die Designprobleme hier beiseite, Sie suchen getattr. Sie können es verwenden, um die Attribute eines Objekts (in Ihrem Fall Methoden) nach Namen zu erhalten. Danach können Sie den Rückgabewert getattr aufrufen.

Demo:

>>> 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

Danke! Hast du einen Vorschlag für das Design? :) Ich habe nicht verstanden, ob etwas in meinem Design falsch ist. – gabboshow

+0

Ich weiß zu wenig über Ihren Code zu beurteilen, * manchmal * eine Funktion/Methode mit Namen zu nennen ist die einfachste Lösung, so ist Ihr Design nicht unbedingt Schlecht. Betrachtet man jedoch Ihre '__init__' Methode, sieht es so aus, als ob Sie versuchen ganze Objekte mit JSON zu speichern und wiederherzustellen. Hast du dir direktere Ansätze wie 'Pickle' angeschaut? – timgeb

Verwandte Themen