内if语句Python的分配(Assign within if statement Python)

2019-10-23 00:06发布

有没有更简单的替代比

res = returns_value_or_none(arg)
if res:
    do_something_with(res)

要么

if returns_value_or_none(arg):
    do_something_with(returns_value_or_none(arg))

其中它结合了分配和if有条件到一个语句?

Answer 1:

通常情况下,你有什么已经是最好的选择。


您可以随时创建一个新的范围值绑定到一个变量:

(lambda res: do_something_with(res) if res else None)(returns_value_or_none(arg))

但是,这肯定不会是更具可读性,或更Python。


如果你只是想保存一条线,你可以这样做:

res = returns_value_or_none(arg)
if res: do_something_with(res)

有时是更具可读性,但通常它是一个净损失。


处理这个另一种方式是改变do_something_with接受None ,什么也不做。 这不是Python作为普通,因为它是在,比如说,Smalltalk或斯威夫特,但它肯定有时有它的地方。

很难明白为什么这样的玩具例子,但如果你调用这些功能的70倍,把检查在一个地方,里面的功能,而不是70米的地方,到处都是它的名字,是一个明显的胜利。 (特别是因为你可能把它在68位,而忘记了其他2)


最后,但并非最不重要的,在很多情况下,正确的答案是例外。 你do_something_with如果传递可能已经提高None 。 你肯定可以改变returns_value_or_nonereturns_value_or_raises

同样,在这个玩具例子,它会只是看起来像更多的代码。 但在现实生活中的代码,它通常是有意义的放码一整块一中try / except ,立刻降底处理所有的错误。 甚至让例外渗透到一个更高的水平,他们更容易处理。

当然,这并不是在任何情况下适当的; 如果你希望None成为一个频繁和完全合理的反应,只是想跳过一个步骤,而不是中止运营的全产业链,检查或通过None将会使很多更有意义比小乱抛垃圾代码try块。



文章来源: Assign within if statement Python