だから、私は賢くて、DRYという共通のコードをたくさんの類似の機能から削除し、それらをヘルパー機能にまとめて1つの場所に定義することで、 (GitHub diffを参照してください)そうすれば、それらはすべて一箇所から変更できます。 (another GitHub diffを参照)ヘルパー関数内から早期に戻る方法は?
だから、もともとそれが
func_A(stuff):
if stuff == guard_condition:
return early
things = boilerplate + stuff
do A-specific stuff(things)
return late
func_b(stuff):
if stuff == guard_condition:
return early
things = boilerplate + stuff
do B-specific stuff(things)
return late
だったと私は
_helper(stuff):
if stuff == guard_condition:
return early
things = boilerplate + stuff
return things
func_A(stuff):
things = _helper(stuff)
do A-specific stuff(things)
return late
func_B(stuff):
things = _helper(stuff)
do B-specific stuff(things)
return late
にそれを変更しかし、私はそれを試してみましたが、私は早く戻って(「警備員」を移動していたので、ことに気づきました?)をヘルパー機能に組み込むと、彼らはもはや機能しなくなりました。これらのケースを処理する元の関数に簡単にコードを追加することができましたが、複雑さを個々の関数に再帰させて繰り返すことなく、これを行う方法はないようです。
このような状況を処理する最もエレガントな方法は何ですか?
オハイオ州、これはデコレータのためのものですか? – endolith
[ガードを実装するためにPythonデコレータを使用する](http://www.siddharta.me/2006/12/using-python-decorators-to-implement.html) – endolith
ああ、しかし、ラップされる関数が異なる数の引数を取る場合デコレータで '* args'を使う必要があります。これが関数シグネチャになります。これは醜いものです。 – endolith