5

私が見つけたもの:

Dive in to Python ではandand演算子の特異な性質とor、ブール演算子の短絡評価を使用して、C の三項演算子と非常によく似た機能のand-or トリックを介して条件をより簡潔に表現する方法について読みました。

子:

result = condition ? a : b

パイソン:

result = condition and a or b

Python ではラムダ関数がワンライナーに制限されているため、これは便利なようですが、論理構文を使用して制御フローを表現します。

Python 2.5 以降、inline-ifが and-or トリックのより読みやすい構文として助けになったようです。

result = a if condition else b

したがって、これは読みにくいand-or-constructのpythonicの代替品であると思います。複数の条件をネストしたい場合でも、非常に包括的に見えます。

result = a if condition1 else b if condition2 else c

しかし、不確実性の世界では、 abc にアクセスするために次のようなコードを書いていることがよくあります。

result = a and hasattr(a, 'b') and hasattr(a.b, 'c') and a.b.c or None 

したがって、inline-ifの助けを借りて、おそらくいくつかのandsorsを取り除くことができ、非常に読みやすいコードが得られます。

result = a.b.c if hasattr(a, 'b') and hasattr(a.b, 'c') else None

私はまた、このレシピで条件付きのやや難解なアプローチを発見しました

result = (a, b)[condition] 

ただし、これはショートサーキットではなく、条件の結果がブール値の 0 または 1 を返さない場合、あらゆる種類のエラーが発生します。

知りたいこと:

今、インラインを使用することが望ましい/よりpythonicであると考えられるかどうか疑問に思います-if下位互換性が問題にならない場合、またはすべてが好みの問題であり、短絡の世界でどれだけ家にいると感じるか評価?

アップデート

inline-if は and-or-trick のシンタックス シュガー以上のものであることに気付きました。これaは、ブール値のコンテキストで が false の場合に失敗しないためです。したがって、おそらくより失敗しないでしょう。

4

4 に答える 4

2

インラインを使用した特別な言語構造があります。これは、必要ifelseことを実行し、言及したような醜い回避策を置き換えるために導入されたものです。これを使用することをお勧めします。特にand--orトリックのようなハックには通常予期しないコーナーケース/バグがあるためです。

たとえば、-トリックはこの場合失敗しますandor

a = 0
b = 1
c = True and a or b

cになりますが1、これは、探している場合に期待するものではありませんif-elseセマンティクス。

では、必要なことを正確に実行する言語構造があるのに、なぜバグのある回避策を使用するのでしょうか。

于 2011-02-28T13:25:40.427 に答える
2

Pythonic で行うべきことは、単一の関数に詰め込んで通常の関数を使用するのに適した範囲を超えてコードを拡張したことを認識することです。lambda名前付き関数でもできないことは、 でできることは何もないことを覚えておいてください。

もちろん、限界点は人によって異なりますが、書いていることに気付いた場合:

return a.b.c if hasattr(a, 'b') and hasattr(a.b, 'c') else None

多すぎる場合は、代わりにこれを行うことを検討してください。

try:
     return a.b.c
except AttributeError:
     return None
于 2011-02-28T13:30:16.027 に答える
0

私は自分のコードが何をしているのかを明確にしたいと思います。インラインifは非常に明示的に条件付き割り当てを行っており、読みやすさは重要です。インラインは、および/または副作用が好ましいと考えられた場合に言語に組み込まれなかったでしょう。

条件式のpepは、その特定の構文が選択された理由についてさらに詳しく説明し、具体的には、および/またはハックについて説明します。

http://www.python.org/dev/peps/pep-0308/

于 2011-02-28T13:25:13.073 に答える
0

これはあなたが言及した特定のケースのためのものですが、チェーン化された短絡ロジックが必要なほとんどすべてのケースは、よりエレガントなソリューションで処理できると思います. これは明らかに好みの問題ですが、追加させてください。上記がこれよりも優れていると思われる場合は、スクラッチしてください。

try:
    foo = a.b.c

except AttributeError:
    print "woops"

それほど単純ではない他のケースでは、すべてのテストを関数にカプセル化すると、可読性が大幅に向上する可能性があります。

編集:ちなみに、アヒルのタイピング

于 2011-02-28T13:30:25.527 に答える