web-dev-qa-db-ja.com

Python-メソッドごとに1つだけ戻りますか?

これが単なる個人的な好みの問題なのか、これを何らかの方法で行うのは実際には悪い習慣なのかを整理しようとしています。最初にPEP8を参照しようとしましたが、答えが見つかりませんでした。

ここで私が話しているのは、複数のreturnステートメントの使用です。これらの例では、suchは非常に短く、読みやすいため、大したことではありません。

_def foo(obj):
    if obj.condition:
        return True
    return False

def bar(obj):
    answer = False
    if obj.condition:
        answer = True
    return answer
_

単に答えを決定してそれを返すのではなく、bar()が呼び出されるたびに変数を割り当てるのは不思議です。しかし、より長い関数では2番目のreturnが非表示になる可能性があるため、コードを読んだ人は、関数が行の終わりに到達する前に値を返す可能性があることに気付かなかった可能性があります。

_def spam(obj):
    blurb = "Francis"
    if obj.condition:
        blurb = map(gormf, [z for z in porp(obj)])
        return blurb[2]
    Elif not obj.condition and dreg(obj.jek):
        blurb = obj.hats * 17
        if blurb % 13: return blurb
    else:
        blurb = obj.name
    return "Whales and %s" blurb
_

それはひどい関数ですが、私が何をしているか理解していると思います。

ですから、実際に必要な操作よりも数少ない操作であっても、single、clear exit-を持つ関数を作成することは望ましいですか?または、可能な限り短いコードを支持して、これを根絶しようとする必要がありますか?

1
user112358

私の個人的な好みは、最初と最後に複数のreturnsを許可することですが、中央にnotがあり、簡単に見落とされる可能性があります。

もちろん、サブルーチンが長すぎて「開始」、「中間」、「終了」がある場合は、とにかく長すぎると主張するかもしれません。

私は特に、末尾のPerlスタイルの条件文を一種の「ガード式」として使用するのが好きです(疑似Rubyの例ですが、他の言語にも同様に適用されます)。

def sort(list)
  return []         if list.empty?
  return list.clone if list.size == 1
  ... actual sorting here
end

またはPythonで:

def sort(list):
  if not list:       return []
  if list.size == 1: return list.clone
  ... actual sorting here
end
3
Jörg W Mittag

「真の場合は真、それ以外の場合は偽」がばかげているという事実は別として、ifであるため、foo()には2つの戻り値しかありません。 expressionではなく、Pythonのstatement。すべてが値を返す式である標準MLのような関数型言語では、foo()は次のようになります。

_fun foo (obj) =
    if obj.condition
    then True
    else False
_

したがって、概念的には、foo()は単一のリターンを持つと見なすことができます。

複数のリターンが混乱し始めるのは、それらを副作用やループステートメントと組み合わせた場合です。その場合、関数の実行を追跡し、関数が早期に中止されるかどうかを判断するのが難しい場合があります。しかし、それが問題になると、関数を書き直して理解しやすくなるように書き直すことは、いくつかのスタイルガイドを厳密に守ることよりもはるかに重要です。

0
Doval