在调用另一个函数后立即从函数返回

时间:2012-02-05 04:19:05

标签: python coding-style return-value

函数calculate_attribute不返回值;它只能通过副作用发挥作用。

通常在该函数中我必须编写以下几行:

print('some message')
set_attribute(value)
return

所以我决定把它放到另一个函数中:

def report_and_set(value, message):
  print(message)
  set_attribute(value)

现在可以执行以下操作:

   def calculate_attribute(params):
     #...
     if something:
       return report_and_set(value, message)
     #...
     if another_condition:
       return report_and_set(value, message)
     #...     

写这个有点奇怪,因为report_and_set没有返回值。但如果我不这样做,我必须在每次致电return后重复输入report_and_set

3 个答案:

答案 0 :(得分:2)

嗯,你必须每次都输入return。我不确定你以你建议的方式获得(或失败),特别是从

开始
return

实际上与

相同
return None

但我想知道为什么你在函数中有这些空的return语句。有必要吗?可能有一种更优雅或更易于阅读的方式来处理此功能中的控制流。函数中间的随机return很容易错过。

更抽象地说,计算返回语句是衡量函数复杂度的一个很好的粗略启发式算法;大多数情况下,更多的回报意味着更多cyclomatic complexity。根据经常引用的“单一进入,单一退出”原则,甚至有一种思想坚持只在任何特定功能中使用return一次。事实上,我认为“单入,单出”不同于“一回归”,这对我来说似乎非常严格,而且有时很繁重。 (有关更多信息,请参阅this post,其中表明“仅返回一个”是基于对SESE的误解)。但是较少的return陈述更好的一般原则对我来说似乎仍然是一个好的。

答案 1 :(得分:1)

许多程序员,包括我自己,prefer a single return per function

有时,如果某些健全性检查失败,我可能会在函数的前几行中插入一个return来保释。

在这种情况下,我不会。

在这种情况下,我只会做......

   def calculate_attribute(params):
     #...
     if something:
       report_and_set(value, message)
     #...
     elif another_condition:
       report_and_set(value, message)
     #...     

但也要考虑Single Responsibility Principle(它同样适用于函数和类)。如果你的函数很长并且包含许多条件函数调用, 可能是refactor的时候了!

答案 2 :(得分:0)

是的,可以这样做。

不,没有错。

继续。