次のようなコードをたくさん書いていることに気づきました。
ans = call_function()
if ans:
return ans
...
これを 1 または 2 ライナーにするきれいな方法はありますか? そのようなパラダイムの「例」は
if x as call_function():
return x
ansがNoneでない限り、暗黙の使用法に基づいて、単に返すことができるようです。
if ans is not None:
return ans
の後に何をしているのかわかりませんif
が、おそらく次のことをしているでしょう:
ans = call_function()
if ans:
return ans
else:
return default
その場合、次のように簡単に実行できます。
return call_function() or default
if ステートメントに代入を埋め込みたいという要求は、おそらく Python に対してよく見られる機能要求の 1 つです。問題は、このような埋め込み代入提案は通常、保存したい値とチェックしたい条件が同一である非常に限られたケースでのみ機能することです (たとえば、例はそのトラップに陥り、代わりにチェックする必要がある場合は役に立たないでしょう)。のようなより具体的な条件if ans is not None:
)。
余分な行が本当に気分を害する場合は、ステートメントを 1 行にまとめることができます ( )。しかし、多くの人はそのスタイルを嫌っています。if
if ans: return ans
ただし、「この関数が意味のあるものを返すかどうかを知りたいです。そうであれば、それもこの関数の結果です。そうでない場合は、フォールバックして別の方法で結果を計算します」という基本的な前提に疑問を投げかけます。適切にスコープされたローカル変数を使用する十分な理由はありません。
別の機能があなたのために仕事を終えたかどうかを知ることは、私にとって非常に重要に思えます。
if ステートメントに続くコードを別の関数にリファクタリングすることは理にかなっています。それぞれの機能に 1 つの非常に具体的なことをさせることを強調する (賢明ではない) 考え方があります。
この場合、次のように書くことができます。
ans = call_function()
return ans if ans is not None else following_code()
または、実際に真の値をテストしている場合 (具体的にテストするのではなくnot None
):
return call_function() or following_code()
このnot None
場合、次ans
のような関数を記述することで、temp 変数への代入を回避できます。
def fallback(test_value, routine, *args, **kwargs):
return test_value if test_value is not None else routine(*args, **kwargs)
そして、次のように使用します。
return fallback(call_function(), following_code,
arg_to_following_code, following_code_kwarg=keywordarg_value)
fallback
これは、この種のことを非常に頻繁に行う場合に役立つかもしれませんが、一般的には、人々があなたの関数に慣れていないため、コードが少し読みづらくなるだけです。質問で使用されている元のフォームはかさばりますが、人々が見慣れているすぐに認識できる形になっています。また、Python の標準のように、1 行に 1 つの論理アクションという非常に慎重な方法で処理を行います。
一方で、タイプミスやスコープの混乱によるバグにつながる可能性があるため、関係のないローカル変数を削除することをお勧めします。