11

C# では、次のように簡単に記述できます。

string stringValue = string.IsNullOrEmpty( otherString ) ? defaultString : otherString;

Python で同じことを行う簡単な方法はありますか、それとも「if」ステートメントにこだわっていますか?

4

9 に答える 9

24

In Python 2.5, there is

A if C else B

which behaves a lot like ?: in C. However, it's frowned upon for two reasons: readability, and the fact that there's usually a simpler way to approach the problem. For instance, in your case:

stringValue = otherString or defaultString
于 2008-09-25T19:08:31.470 に答える
5

@ダン

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

このタイプのコードはより長く、より表現力豊かですが、より読みやすくなっています

そうですね、長くなりました。「より表現力豊か」と「より読みやすく」についてはよくわかりません。少なくとも、あなたの主張には議論の余地があります。2 つの理由から、それは完全に間違っているとさえ言えます。

まず、あなたのコードは意思決定を (かなり極端に) 強調しています。一方、条件演算子は、他の何か、つまり値 (またはその値の代入) を強調します。そして、これはまさにこのコードの作成者が望んでいることです。意思決定は、むしろコードの副産物です。ここで重要な部分は代入操作です。あなたのコードは、この割り当てを多くの構文ノイズ、つまり分岐に隠しています。

あなたのコードは、重要な部分から重点を移すため、表現力が低下します。

それでも、あなたのコードはおそらく?:. inline-ifが望ましいでしょう。個人的には、Python 2.5 で導入されたバリアントは逆なので好きではありません。C の三項演算子と同じフロー (方向) で読み取るものを好みますが、ASCII 文字の代わりに単語を使用します。

C = if cond then A else B

これは圧倒的に勝ちます。

残念ながら、C と C# には、そのような表現力のあるステートメントはありません。しかし (これが 2 番目の引数です)、C 言語の三項条件演算子は非常に長い間確立されているため、それ自体がイディオムになっています。if三項演算子は、「従来の」ステートメントと同じくらい言語の一部です。これはイディオムなので、その言語を知っている人なら誰でもすぐにこのコードを正しく読むことができます。さらに、これらのセマンティクスを表現する非常に短く簡潔な方法です。実際、それは想像できる最短の方法です。無用なノイズで本質を覆い隠していないため、非常に表現力豊かです。

最後に、Jeff Atwood はこれに対する完璧な結論を書いています

于 2008-09-25T19:27:21.020 に答える
1

It's never a bad thing to write readable, expressive code.

if otherString:
   stringValue = otherString
else:
   stringValue = defaultString

This type of code is longer and more expressive, but also more readable and less likely to get tripped over or mis-edited down the road. Don't be afraid to write expressively - readable code should be a goal, not a byproduct.

于 2008-09-25T19:11:18.733 に答える
1

この質問にはいくつかの重複があります。

本質的に、一般的な設定では、2.5 より前のコードはこれを使用する必要があります。

 (condExp and [thenExp] or [elseExp])[0]

(与えられた condExp、thenExp および elseExp は任意の式です)、短絡評価を維持しながら、thenExp がブール値 False に評価された場合に誤った結果を回避するためです。

于 2009-10-21T15:37:05.487 に答える
0

ところで、j0rd4n さんは C# でこのようなコードを書きません (しないでください!)。IsDefaultOrNullが実際に と呼ばれているという事実は別としてIsNullOrEmpty、これは純粋なコードの肥大化です。C# は、次のような状況で合体演算子を提供します。

string stringValue = otherString ?? defaultString;

これotherStringnull(空ではなく) である場合にのみ機能することは事実ですが、これが事前に保証されている場合 (多くの場合、保証されている場合)、コードがはるかに読みやすくなります。

于 2008-09-25T19:32:01.787 に答える
0

また、「or」演算子を使用するだけでかなりうまくいくこともわかりました。例えば:

finalString = get_override() or defaultString

get_override()が "" または None を返す場合、常に defaultString を使用します

于 2008-09-25T20:40:32.357 に答える
-1

Rubyを使用した場合、次のように書くことができます

stringValue = otherString.blank? ? defaultString : otherString;

組み込みblank?メソッドは null または空を意味します。
ダークサイドに来て...

于 2008-09-25T20:37:53.003 に答える
-1

論理式が true または false ステータスだけでなく、その値を返すという事実を利用できます。たとえば、いつでも使用できます。

result = question and firstanswer or secondanswer

firstanswer が false の場合、三項演算子のように機能しないことに注意してください。これは、firstanswer が false でない限り、firstanswer が返されると仮定して、最初に question が評価されるためです。したがって、この使用法は三項演算子のようには機能しません。ただし、値がわかっている場合は、通常は問題ありません。例は次のとおりです。

result = choice == 7 and "Seven" or "Another Choice"
于 2008-09-25T19:14:05.543 に答える