2016-03-31 3 views
0

私は2つの関数を持っていますが、それぞれは3番目の関数を呼び出しますが、わずかに異なるものが返されると予想します。関数がPythonで呼び出された場所に基づいて異なる値を返す

すべての機能は別々のファイルにあります。ファイルAとBは互いにインポートできないため、関数AとBは互いに呼び出すことができません。これを整理する最良の方法は何ですか?

私はDRYプリンシパルと一致するように、ほとんどの機能が同じであるため、機能の重複を避けたいと思います。ここで

は私が持っているもののためにいくつかの擬似コードである、と私はプログラムを考えてどのように構造化することになります。

#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 

私が考えることができる唯一の解決策は、rawdataと一緒に2番目の変数を渡すことです。それが由来する機能のame。しかし、これは私にとってうらやましいようです。

これを行うには理想的な方法はありますか?おそらく、関数がどこから呼び出されたかチェックする必要はなく、functionCは、データが返される場所によって若干異なる結果を返すことが可能です。私は少しコードを再構成することができるかもしれませんが、3つの機能はすべて現在のファイルに残す必要があります。

+6

を呼び出し、[トレースバック](HTTPSが常にあります。 org/2/library/traceback.html)モジュールを使用します。コンテキスト情報を追加することなく、呼び出し元に基づいて動作を変更するのは悪い形です。 –

+4

2番目のパラメータ 'moreProcessing = False'を追加するだけですが、実行する処理の_type_を指定する追加の引数を追加するのは悪い方法ではありません。 –

+2

functionAに必要なファイルAに特有のものと、functionBにはfileB固有のものを入れ、functionCは両方に共通するものだけを処理することをお勧めします。 – glibdud

答えて

3

特別な関数引数を追加するだけではどうですか? //docs.python:私はこれは恐ろしいアイデアだと思いますが

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

は次にAであなたがfunctionC(stuff)としてそれを呼び出すと、BにあなたがfunctionC(stuff, extra_processing=True)

+0

これは私のニーズにはうまく機能します。ありがとうございました! –

3

あなたのアプローチは間違っていると思います。私は何だろうと、tobias_kがさらによりカプセル化の道を

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

オプションの二番目のパラメータを持っており、

def functionA() 
    useabledata = functionC(rawData) 

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

ようにそれを呼び出すために、言ったように、この

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* 

その他のオプションはありますそうでしょうか

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

それは両方ともそれを整理する良い方法です。どのようにしたいのか正確に私はいくつかを与える必要がありますが、ありがとう! –

関連する問題