在调用另一个函数后立即返回函数
函数 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 个回答
是的,这样做是可以的。
不,这样做没有问题。
继续吧。
其实,不管怎样,你每次都得输入 return
。我不太明白你这样做有什么好处(或者坏处),特别是因为
return
实际上和
return None
是一样的。
不过我在想,为什么你的函数里会有这些空的返回语句呢?这是必要的吗?可能有更优雅或者更容易理解的方式来处理这个函数的控制流。在函数中间随便放一个 return
可能会很容易被忽略。
从更抽象的角度来看,计算返回语句的数量是衡量函数复杂度的一个粗略方法;大多数情况下,返回语句越多,意味着复杂度越高。还有一种观点认为,在任何函数中只使用一次 return
是更好的做法,这基于一个常被提到的原则:“单入口,单出口。” 事实上,我认为“单入口,单出口”和“只一个返回”是不同的,后者听起来有点严格,有时候也让人觉得麻烦。(想了解更多,可以看看这篇文章,它认为“只一个返回”是对SESE的误解)。不过,我觉得总的来说,返回语句少一点是更好的原则。
很多程序员,包括我自己,喜欢每个函数只用一个 return
。
有时候,我可能会在函数的前几行插入一个 return
,这样如果某些检查不通过,就可以直接退出这个函数。
但在这种情况下,我不会这样做。
在这种情况下,我会简单地这样做……
def calculate_attribute(params):
#...
if something:
report_and_set(value, message)
#...
elif another_condition:
report_and_set(value, message)
#...
不过也要考虑一下 单一职责原则(这个原则同样适用于函数和类)。如果你的函数很长,并且包含很多条件调用其他函数的情况,可能是时候进行重构了!