2017-05-19 9 views
0

を変更するたびに、私は頻繁に私は、以前のモジュールで書いた原始関数を呼び出すより高度なラッパー関数を記述呼び出します。要点は、プリミティブ関数からのコードを再利用し、余分な、しかし任意のことをすることです。痛みポイントは、プリミティブ関数のパラメータを更新するたびに、高度関数で調整する必要があります。高度な関数が書かれた方法(以下のような方法)でこのような動的な方法がありますか?または、一般的にはよりよい解決策がありますか?避け、パラメータが

私は、すべての包括的な一般的な関数を書くこともできますが、私はそれは、コードの無駄だと思います。

それは、追加のオプションパラメータを追加するには、以下の例のようが、追加のラッパーで深く深くネストされた関数で、通常です。

高度/ラッパー関数

def pb_jam_sandwich(sandwich, pb, jam=None): 
    if jam is None: 
     pb_sandwich(sandwich, pb) 
    else: 
     pb_sandwich(sandwich, pb) 
     add_jam(jam) 

それが働いていた場合、私は、高度な機能のために、このような何かを考えていた:

def pb_jam_sandwich(*args, jam=None): 
    if jam is None: 
     pb_sandwich(*args) 
    else: 
     pb_sandwich(*args) 
     add_jam(jam) 
+0

あなたは[デコレーター](https://wiki.python.org/moin/PythonDecorators)に見たことがありますか?それは彼らの主な目的であり、元の機能に加えて何か追加的な機能を果たします。 'add_jam' – CoryKramer

+0

@私は別のデザインの答えを提供してきましたが、私はこの質問はあなたの実際のコードについて詳しく説明せずに客観的に答えることができるかわかりません。それが立てば、私は主に意見に基づいた答えがあると思う。 – chepner

+0

返信いただきありがとうございます。デコレータはここで話題になると思いましたが、この場合どのように使用するのか分かりません。 @chepner私は私のユースケースについてより明確にしてきたはずです。私は通常、コードの書き換えを防ぐために、特定の関数の観点から一般的な関数(より多くのパラメータを持つ)を記述します。一般的な関数は、例えば特定の関数を10回呼び出すことができます。 –

答えて

1

私はあなたのデザインが逆方向だと思います。より具体的な機能は、より一般的なものとして定義する必要があります。

# Note: no default values 
def pbandjsandwich(pb, sandwich, jam): 
    return pb + sandwich + jam 

def pbsandwich(pb, sandwich): 
    return pbandjsandwich(pb, sandwich, 0) 

今、あなたはjamのデフォルト値が十分であれば、あなたは全く別の関数pbsandwichを必要とする、またはかどうかの質問をすることができます。

def pbandjsandwich(pb, sandwich, jam=0): 
    return pb + sandwich + jam 

は、第二の関数呼び出しを回避するだろう少なくとも、より効率的です。