有没有更简单的替代比
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
有条件到一个语句?
有没有更简单的替代比
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))
但是,这肯定不会是更具可读性,或更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_none
到returns_value_or_raises
。
同样,在这个玩具例子,它会只是看起来像更多的代码。 但在现实生活中的代码,它通常是有意义的放码一整块一中try
/ except
,立刻降底处理所有的错误。 甚至让例外渗透到一个更高的水平,他们更容易处理。
当然,这并不是在任何情况下适当的; 如果你希望None
成为一个频繁和完全合理的反应,只是想跳过一个步骤,而不是中止运营的全产业链,检查或通过None
将会使很多更有意义比小乱抛垃圾代码try
块。