在Python中,如果函数的值不是None,是否有一种简洁的方法来返回函数的值?

时间:2011-04-03 05:08:27

标签: python idioms paradigms

我发现自己编写了许多类似于以下内容的代码:

ans = call_function()
if ans:
    return ans

...

是否有一种干净的方法可以使它成为1或2个衬垫?这种范式的“例子”可能是

if x as call_function():
    return x

4 个答案:

答案 0 :(得分:1)

似乎只要而且不是None,您可以根据您的隐含用法返回它。

if ans is not None:
    return ans

答案 1 :(得分:1)

我不确定你在if之后做了什么,但也许你正在做以下事情:

ans = call_function()
if ans:
    return ans
else:
    return default

在这种情况下你可以做到:

return call_function() or default

答案 2 :(得分:0)

将可能跟随if语句的代码重构为另一个函数可能是有意义的。有一种(不是不明智的)思想流派强调让每个功能做一件非常具体的事情。

在这种情况下,你可以这样写:

ans = call_function()
return ans if ans is not None else following_code()

或者,如果你真的在测试一个真正的价值(而不是专门测试not None):

return call_function() or following_code()

not None的情况下,您仍然可以通过编写如下函数来避免分配给临时变量ans

def fallback(test_value, routine, *args, **kwargs):
    return test_value if test_value is not None else routine(*args, **kwargs)

然后像这样使用它:

return fallback(call_function(), following_code,
                arg_to_following_code, following_code_kwarg=keywordarg_value)

如果您经常这样做,这可能会有用,但一般情况下它会让您的代码更难阅读,因为人们不会熟悉您的fallback函数。您问题中使用的原始表单体积庞大,但它具有易于识别的形状,人们习惯于看到它。它还以非常严格的方式处理事情,每行一个逻辑操作,这是Python中的标准。

另一方面,删除多余的局部变量可能会很好,因为这些变量会因拼写错误或范围混乱而导致错误。

答案 3 :(得分:0)

想要在if语句中嵌入赋值可能是我们在Python中看到的更常见的功能请求之一。问题是这样的嵌入式分配建议通常只适用于您想要存储的值要检查的条件相同的非常有限的情况(例如,您的示例属于该陷阱并且将是如果您需要检查更具体的条件,例如if ans is not None:),则无用。

如果额外的行真的冒犯了你,你可以if语句折叠为一行(if ans: return ans)。但很多人讨厌这种风格。

然而,我质疑你的基本前提是“我想知道这个函数是否返回有意义的东西,如果是,那么这也是这个函数的结果,否则我会回退并计算我的结果。方式“不足以证明使用适当范围的局部变量。

知道另一个功能是否已经完成了你的工作听起来对我来说非常重要。