繁体   English   中英

在 if 语句中赋值 Python

[英]Assign within if statement Python

有没有比这更简单的选择

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条件组合到一个语句中的语句?

通常,你所拥有的已经是最好的选择。


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

(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 个。)


最后但并非最不重要的一点是,在许多情况下,正确的答案是例外。 如果您通过None您的do_something_with可能已经提高了。 而且您肯定可以将returns_value_or_none更改为returns_value_or_raises

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

当然,这并不适用于所有情况。 如果您期望None是一个频繁且完全合理的响应,并且只想跳过一个步骤而不是中止整个操作链,那么检查或传递None将比将您的代码乱扔垃圾更有意义try块。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM