web-dev-qa-db-ja.com

変数を返すvs関数呼び出しを返す

メソッドから値を返すために推奨されるPythonの方法は何ですか?その理由は何ですか? PEP8スタイルガイドにこれに関するドキュメントはありますか、見つかりませんでした。

方法1

def method():
    a = meth2()
    return a

方法2

def method():
    return meth2()
8
firekhaya

PEP8 は、関数に対して変数を返す必要があるかどうかを指定しません。

しかし、それはあなたが一貫しているべきだと言っています:

Returnステートメントで一貫性を保ちます。関数内のすべてのreturnステートメントは式を返すか、いずれも返さない必要があります。 returnステートメントが式を返す場合、値が返されないreturnステートメントは、これをreturn Noneとして明示的に記述し、明示的なreturnステートメントは関数の最後に存在する必要があります(到達可能な場合)。

_# Yes
def myfunction(a: int, b: int) -> int:
    if a % 2 == 0:
        return int(a ** b)
    else:
        return 0

# No
def my_bad_function(a: int, b: int) -> int:
    if a % 2 == 0:
        return int(a ** b)
    # Implicitly returns None when the above if statement evaluates False
_

同じタイプの変数を返すことも(PEP8ではカバーされていませんが)良い考えです。
上記の関数にオプションの型ヒントを追加したことがわかります。 2番目の関数は時々Noneを返します。
これは、この関数を使用するコードの別のブロックが、戻り値がint.bit_length()などのintと同じ属性を持つことを期待している場合に問題を引き起こす可能性があります。

例外が発生するコードの例:

_for n in range(1, 10):
    nlen = my_bad_function(n * 5, n).bit_length()
_
5
Vasili Syrakis

関数から受け取った値を返すだけの場合は変数が必要ないため、方法2は適切と思われます。さらに、このように見栄えがします:P

方法1はデバッグ目的で使用できます。または、値を返す前に何か他のことを行う必要があります。

1
Pankaj Singhal

私は方法1のbcosを好みます。これにより、デバッグが簡単になります(それなしで生活できますか?)

Mehtod 2のコードをデバッグしている場合は、pycharm Evaluate Expressionオプションを使用して、返されるreturnステートメントを確認します。

0
shoaib shaikh