是否有比
更简单的替代方案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
条件组合成一个语句的那个?
答案 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_with
,None
可能已经加注。您肯定可以将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