【问题标题】:In Python, is there a clean way to return the value of a function if it's not None?在 Python 中,如果函数的值不是 None,是否有一种干净的方法来返回函数的值?
【发布时间】:2011-04-03 05:08:27
【问题描述】:

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

ans = call_function()
if ans:
    return ans

...

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

if x as call_function():
    return x

【问题讨论】:

  • ans is None时你会返回什么?
  • 如果 ans 没有,那么你继续在函数中(一个示例应用程序是 memoization)
  • if ans 将适用于任何“真实”值。请参阅docs.python.org/library/stdtypes.html#truth-value-testing,了解哪些值被视为错误。
  • 这没有多大意义——除此之外: if....: return ... 属于两行。我们不喜欢 Python 世界中的单行代码。
  • 是的,我明白了。问题是它是 3 行(我可以使用 2 行)。具体来说,如果 only 我要做的事情是返回它并在之后立即丢弃它,则没有理由在整个函数的范围内为 call_function() 赋值。跨度>

标签: python idioms paradigms


【解决方案1】:

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

if ans is not None:
    return ans

【讨论】:

  • 重点是,如果我以后不打算使用它,我不想声明一个单独的变量“ans”。
【解决方案2】:

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

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

在这种情况下,您可以简单地这样做:

return call_function() or default

【讨论】:

    【解决方案3】:

    将 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 中的规范。

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

    【讨论】:

      【解决方案4】:

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

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

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

      知道另一个函数是否为你完成了这项工作对我来说非常重要。

      【讨论】:

        猜你喜欢
        • 2015-07-03
        • 2021-09-13
        • 2018-03-08
        • 2017-05-20
        • 1970-01-01
        • 2018-06-08
        • 2018-09-17
        • 2014-01-25
        • 2014-02-15
        相关资源
        最近更新 更多