在if语句Python中分配

时间:2015-05-06 02:39:30

标签: python if-statement assign

是否有比

更简单的替代方案
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条件组合成一个语句的那个​​?

2 个答案:

答案 0 :(得分:2)

通常,你拥有的东西已经是最好的选择了。

您始终可以创建新范围以将值绑定到变量:

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

但那肯定不会更具可读性,或更多Pythonic。

如果您只想保存一行,可以执行以下操作:

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

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

另一种处理此问题的方法是将do_something_with更改为接受None并且不执行任何操作。这在Python中并不常见,比如Smalltalk或Swift,但它肯定有时会占有一席之地。

很难理解为什么这样的玩具示例,但如果您将这些功能调用70次,将支票放在功能内的一个地方,而不是在70个地方,到处都是它被称为,是一个明显的胜利。 (特别是因为你可能把它放在68个地方而忘记了另外2个。)

最后但并非最不重要的是,在许多情况下,正确的答案是例外。如果您通过do_something_withNone可能已经加注。您肯定可以将returns_value_or_none更改为returns_value_or_raises

同样,在这个玩具示例中,它看起来就像更多的代码。但在实际代码中,将整个代码块放在try / except中通常是有意义的,并在最后处理所有错误。或者甚至让异常渗透到更高级别,以便更容易处理。

当然,在每种情况下都不合适;如果你期望None是一个频繁而完全合理的回应,并且只想跳过一步而不是中止整个操作链,那么检查或通过None将会使比使用小try块乱丢你的代码更有意义。

答案 1 :(得分:1)

对于 Python 3.8+,PEP 572 引入了赋值表达式

这允许使用符号 NAME := expr 为表达式中的变量赋值。它可以在 if 语句中使用,例如:

if (match := pattern.search(data)) is not None:
    # Do something with match