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

3 投票
3 回答
3790 浏览
提问于 2025-04-17 12:21

函数 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 并没有返回值。不过如果不这样做,我就得在每次调用 report_and_set 后面都重复写 return

3 个回答

0

是的,这样做是可以的。

不,这样做没有问题。

继续吧。

2

其实,不管怎样,你每次都得输入 return。我不太明白你这样做有什么好处(或者坏处),特别是因为

return

实际上和

return None

是一样的。

不过我在想,为什么你的函数里会有这些空的返回语句呢?这是必要的吗?可能有更优雅或者更容易理解的方式来处理这个函数的控制流。在函数中间随便放一个 return 可能会很容易被忽略。

从更抽象的角度来看,计算返回语句的数量是衡量函数复杂度的一个粗略方法;大多数情况下,返回语句越多,意味着复杂度越高。还有一种观点认为,在任何函数中只使用一次 return 是更好的做法,这基于一个常被提到的原则:“单入口,单出口。” 事实上,我认为“单入口,单出口”和“只一个返回”是不同的,后者听起来有点严格,有时候也让人觉得麻烦。(想了解更多,可以看看这篇文章,它认为“只一个返回”是对SESE的误解)。不过,我觉得总的来说,返回语句少一点是更好的原则。

1

很多程序员,包括我自己,喜欢每个函数只用一个 return

有时候,我可能会在函数的前几行插入一个 return,这样如果某些检查不通过,就可以直接退出这个函数。

但在这种情况下,我不会这样做。

在这种情况下,我会简单地这样做……

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

不过也要考虑一下 单一职责原则(这个原则同样适用于函数和类)。如果你的函数很长,并且包含很多条件调用其他函数的情况,可能是时候进行重构了!

撰写回答