2017-05-15 6 views
0

Ich bin ziemlich neu zu Python, aber ich habe nicht gefunden Ich habe ein Fluss-Netzwerk, das ich ein paar Algorithmen verwenden möchten.Call Funktionen in Funktion mit verschiedenen Eingabeargumente

Der erste Schritt besteht darin, die Daten zu laden und sie so zu verarbeiten, dass ich sie nutzen kann. Ich möchte eine Funktion, die die Daten lädt und vorverarbeitet und dann eine andere Funktion aufruft, um sie zu verarbeiten.

Abhängig von dem Algorithmus, den ich aufrufen möchte, brauche ich verschiedene Eingabeargumente. Ich muss die Argumente für den Algorithmus in den Ladealgorithmus geben.

Gibt es eine Möglichkeit, dass die Funktion so funktioniert, dass die Funktion weiß, welches Argument für einen Algorithmus ist?

Die Art, wie der Code weiß, dass "calc_network (Daten, algorithm3, inputB)" so funktioniert, wie ich es vorhabe.

Die Art, wie ich sehe, müsste ich die Eingabe "calc_network (Daten, algorithm3,0, inputB, 0)" geben.

Also muss ich leere Werte für Werte, die ich brauche nicht korrekt?

Ist die Art, wie ich über das Problem richtig denke, oder habe ich ein grundlegendes Missverständnis?

Vielen Dank im Voraus Leo

+0

Warum definieren Sie alle diese Funktionen * innerhalb * 'cal c_network'? – chepner

Antwort

0

Sie würde das nicht verschachtelt werden Funktionen wie. Sie würden mehrere Funktionen haben und die untergeordneten Funktionen von der übergeordneten Funktion aufrufen.

Wenn Sie Ihre Funktionen in einer ähnlichen Struktur wie dem, über das Sie sprechen, behalten möchten, sollten Sie wahrscheinlich Klassen in Betracht ziehen.

class Foo(object): 
    def __init__(self, your, data, arguments): 
     Determine which function to send data to 
     self.data = call function(s) and get the data. 
    def algorithm1(self, processedData, inputA, inputB) 
     return results 
    def algorithm2(self, processedData, inputA, inputC) 
     return results 
    def algorithm3(self, processedData, inputB) 
     return results 

Auf diese Weise, wenn Sie die Daten möchten, können Sie es tun, indem Sie die Klasse instanziieren.

foo = Foo(your, data, arguments) 

Dann werden Ihre Ergebnisse zugänglich sein mit:

foo.data 
1

diesen Ansatz versuchen functools.partial mit:

from functools import partial 

def algorithm1(data, input_a, input_b): 
    return 'algorithm1 result' 

def algorithm2(data, input_a, input_c): 
    return 'algorithm2 result' 

def algorithm3(data, input_b): 
    return 'algorithm3 result' 

def calc_network(data, algorithm): 
    def process_data(data): 
     return 'processed {}'.format(data) 
    processed_data = process_data(data) 
    return algorithm(processed_data), processed_data 

print(calc_network('data1', partial(algorithm1, input_a=1, input_b=2))) 
print(calc_network('data2', partial(algorithm2, input_a=1, input_c=3))) 
print(calc_network('data3', partial(algorithm3, input_b=2))) 

Dies erzeugt:

('algorithm1 result', 'processed data1') 
('algorithm2 result', 'processed data2') 
('algorithm3 result', 'processed data3') 
Verwandte Themen