2016-03-31 2 views
0

Ich habe zwei Funktionen, von denen jede eine dritte Funktion aufrufen, aber erwarten, dass eine etwas andere Sache zurückgegeben wird.Rückgabe verschiedener Werte basierend auf wo Funktion aufgerufen wird in Python

Alle Funktionen sind in separaten Dateien. Die Dateien A und B können sich NICHT gegenseitig importieren, daher können sich die Funktionen A und B nicht gegenseitig aufrufen. Was ist der beste Weg, dies zu organisieren?

Ich möchte vermeiden, die Funktion zu duplizieren, da das meiste davon identisch ist, um in Einklang mit DRY-Prinzipien zu bleiben. Hier

ist einige Pseudo-Code für das, was ich habe, und wie ich das Programm denke würde strukturiert:

#FileA.py 
def functionA(): 
    useableData = functionC(rawData) 

-

#FileB.py 
def functionB(): 
    useableData = functionC(rawData) 

-

#FileC.py 
def functionC(rawdata): 
    *Extensive processing/formatting of data* 
    if C run from A: 
     return useableData 

    if C run from B: 
     *A bit more processing of data* 
     return useableData 

Die Die einzige Lösung, die ich mir vorstellen kann, ist eine zweite Variable zusammen mit rawdata, eine Zeichenfolge, die das n sagt ame der Funktion, aus der es kam. Aber das scheint mir unelegant.

Gibt es einen idealen Weg, dies zu tun? Vielleicht nicht mit der Überprüfung, woher die Funktion aufgerufen wurde, aber immer noch functionC etwas andere Ergebnisse zurückgeben, abhängig davon, wo die Daten zurückgegeben werden. Ich könnte den Code ein wenig restrukturieren, aber alle drei Funktionen müssen in ihren aktuellen Dateien bleiben.

+6

Während ich denke, das ist eine schreckliche Idee ist, gibt es immer die [Zurückverfolgungs] (https: //docs.python. org/2/library/traceback.html). Es ist jedoch eine schlechte Form, das Verhalten basierend auf dem Anrufer ohne zusätzliche Kontextinformationen zu ändern. Es ist keine schlechte Form, ein zusätzliches Argument hinzuzufügen, das angibt, welcher _type_ der Verarbeitung durchgeführt werden soll, obwohl –

+4

Nur einen (optionalen) zweiten Parameter 'moreProcessing = False' hinzufügen? –

+2

Ich würde empfehlen, alles, was spezifisch ist, was Datei benötigt, in FunktionA und alles, was spezifisch für Datei B ist, in FunktionB zu setzen und FunktionC zu lassen, um nur das zu behandeln, was beiden gemeinsam ist. – glibdud

Antwort

3

Warum nicht einfach ein zusätzliches Funktionsargument hinzufügen?

def functionC(rawdata, extra_processing=False): 
    # extensive processing 
    if extra_processing: 
     # more processing 
    return usable_data 

Dann in A rufen Sie es als functionC(stuff), und in B rufen Sie functionC(stuff, extra_processing=True)

+0

Das funktioniert ziemlich gut für meine Bedürfnisse. Vielen Dank! –

3

Ich denke, Ihre Vorgehensweise ist falsch. Was ich tun würde, ist diese

def functionA(): 
    useabledata = functionC(rawData) 


def functionB(): 
    useabledata = functionD(functionC(rawData)) 


def functionC(rawData): 
    *Extensive processing/formatting of data* 

def functionD(partiallyProcessedData): 
    *A bit more processing of data* 

Andere Option ist als tobias_k sagte, haben einen optionalen zweiten Parameter

def functionC(rawData, moreProcessing=False): 
    *Extensive processing* 
    if not moreProcessing: 
     return data 
    *more processing* 
    return data 

Und nennen Sie es wie

def functionA() 
    useabledata = functionC(rawData) 

def functionB() 
    useabledata = functionC(rawData, True) 

Eine noch gekapselter Weise wäre es

def functionA(): 
    useabledata = functionC(rawData) 


def functionB(): 
    useabledata = functionD(rawData) 


def functionC(rawData): 
    *Extensive processing/formatting of data* 

def functionD(rawData): 
    partialProcessedData = functionC(rawData) 
    *A bit more processing of data* 
+0

Das sind beide gute Möglichkeiten, es zu organisieren. Ich muss einige geben, genau wie ich es machen will, aber danke! –

Verwandte Themen