web-dev-qa-db-ja.com

Pythonの `x if x else y`ステートメントを圧縮する

私はPythonの三項演算子アプローチに精通しています:

value = foo if something else bar

私の質問は非常に簡単です。事前の割り当てなしで、とにかく評価されている用語を参照することがあります(if ...)戻りオペランドの1つ(... ifまたはelse ...)?

ここでの動機は、時々if ...それはまさに、三項演算の結果として欲しいものです。ただし、小さな式の場合は問題なく繰り返すことができますが、少し長い式の場合はやや厄介です。これを例に取ります:

value = info.findNext("b") if info.findNext("b") else "Oompa Loompa"
25
Rubens

これを行う方法はありません。それは意図的なものです。三項ifは、些細な場合にのみ使用されることになっています。

計算の結果を2回使用する場合は、一時変数に入れます。

value = info.findNext("b")
value = value if value else "Oompa Loompa"

これを行うと、愚かなことをしていることが明らかになります。実際、これを記述するPythonの方法は次のとおりです。

value = info.findNext("b")
if not value:
    value = "Oompa Loompa"

そして、それは実際に5回ですfewerあなたの最初の試みよりもキーストローク。

本当にキーストロークを保存したい場合、代わりにこれを行うことができます:

value = info.findNext("b") or "Oompa Loompa"

しかし、それは多くのスタイルガイドやBDFLによって推奨されていません。

これを1回だけ行う場合は、より明示的にする方が適切です。あなたがそれを半ダース回やっているなら、findNextがオプションのデフォルトを取り、Noneの代わりに返すようにすることは、すべての組み込みおよびstdlibのように、些細なことです。関数:

def findNext(self, needle, defvalue=None):
    # same code as before, but instead of return None or falling off the end,
    # just return defvalue.

次に、これを行うことができます:

value = info.findNext("b", "Oompa Loompa")
30
abarnert

if ... elseを使用しないでください。代わりに、Pythonの合体演算子を利用してください。

value = info.findNext("b") or "Oompa Loompa"