式を短く書く方法:
return '%.0f' % float_var if float_var else float_var
また
if float_var:
return formatted_string
else:
return None
ありがとう!
この表現<value> if <condition> else <other_value>
はすでにかなり慣用的です-確かに他の例よりもそうです、そしておそらく<value>
単純なときはいつでも好まれます。これはPythonの三項演算子なので、のようなものを探していた場合<condition> ? <value> : <other_value>
、それは存在しません。
計算する<value>
か<other_value>
、いくつかの手順を実行する場合は、より長いif: ... else: ...
代替手段を使用してください。
式を読みやすくするために角かっこを使用します。
return ('%.0f' % float_var) if float_var else float_var
私が最初にそれを見たとき、私はそれを次のように読みました
return '%.0f' % (float_var if float_var else float_var)
それはばかげているでしょう。私はそれがどちらの方法で機能するかを確認するためにそれを試してみなければなりませんでした。
ところで、最初の例は2番目の例と同等ではありません
if float_var:
return formatted_string
else:
return None
これは常にフォーマットされた文字列またはNoneのいずれかを返します。Falseと評価されるもの(False、0、0.0、 ""、[]など)を渡した場合の最初の例では、変更されていないものが返されるため、戻りタイプはstring、boolean、list、int、floatなどになります。特に0.0がfloat_varの正当な値である場合は、おそらくあなたが望むものではありません。コードを次のように変更します。
return ('%.0f' % float_var) if isinstance(float_var, float) else None
または:
try:
return "%.0f" % float_var
except TypeError:
return None
これは、他の整数(およびlong)をfloatに変換することで機能します。
正確に何をしたいのかは明確ではありません。
最も文字通りの解釈では、このように機能します
>>> float_var = 4.5
>>> '%.0f' % float_var if float_var else float_var
'5' # This is a string
>>> float_var = 0.0
>>> '%.0f' % float_var if float_var else float_var
0.0 # This is a float
あなたが望んでいないことはほぼ確実です。
None
「 」でチェックしたいのif float_var
ですか?その場合は、" if foo is not None
" ではなく常に " " と綴りますif foo
。前者の方が明確で、バグが発生しにくいためです。
それが意図したものである場合は、モデルを修正することをお勧めします。繰り返し戻ってエラーを伝播するNone
のは悪いことです。それは醜く、バグが発生しやすく、慣用的ではありません。代わりに例外を使用してください。
短いほど良いとは限りません。あなたのスニペットは、痛々しいほど長くも、扱いにくいものでもありません。実際、潜在的なバグを避けるためにそれらを使用する場合は、もう少し長くしたいと思うでしょう。
or
。ただし、これによりコードが読みにくくなり、 との間で他の false 値を指定することができなくなりNone
、バグにつながることがよくあります。すでに使用しているv if c else u
場合は、最も読みやすく効率的な三項演算子をすでに使用しています。
他の方法もありますが、読みやすさに問題があります。
float_var and "%.0f" % float_vav
すごいじゃないですか。