我发现自己编写了很多类似于以下内容的代码:
ans = call_function()
if ans:
return ans
...
有没有一种干净的方法可以使它成为 1 或 2 衬里?这种范式的一个“例子”可能是
if x as call_function():
return x
我不确定您在 之后在做什么if
,但也许您正在执行以下操作:
ans = call_function()
if ans:
return ans
else:
return default
在这种情况下,您可以简单地执行以下操作:
return call_function() or default
似乎只要 ans 不是 None,您就可以根据您的隐含用法返回它。
if ans is not None:
return ans
想要在 if 语句中嵌入赋值可能是我们在 Python 中看到的更常见的功能请求之一。问题在于,这种嵌入式分配建议通常仅适用于您要存储的值和要检查的条件相同的非常有限的情况(例如,您的示例落入了该陷阱,如果您需要检查,则将无用更具体的条件,如if ans is not None:
)。
如果额外的行真的冒犯了您,您可以将语句折叠为if
单行 ( if ans: return ans
)。不过,很多人讨厌这种风格。
但是,我质疑您的基本前提,即“我想知道这个函数是否返回有意义的东西,如果是,那么这也是这个函数的结果,否则我将退回并以其他方式计算我的结果”是'没有足够的理由使用适当范围的局部变量。
知道另一个函数是否为你完成了这项工作对我来说非常重要。
将 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
通过编写如下函数来避免分配给 temp 变量:
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 中的规范。
另一方面,删除无关的局部变量可能会很好,因为这些可能会由于拼写错误或范围混淆而导致错误。