在调用另一个函数后立即返回函数
函数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
。
许多程序员,包括我自己,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的时间!
我认为单一入场单出口不同于“单回单”,这看起来相当严格,并且有时很繁重。 [第二个回答](http://programmers.stackexchange.com/a/118793)对你所关联的问题表明“仅一次回报”是基于对SESE的误解。尽管如此,我同意一般情况下,计算“回报”陈述是衡量函数复杂性的一个粗略的启发式;更多的回报=更多[圈复杂度](http://en.wikipedia.org/wiki/Cyclomatic_complexity)。 – senderle 2012-02-05 15:25:09
@senderle:+1一个非常有趣的见解和链接。 – max 2012-02-08 18:00:00
是的,可以这样做。
不,没有错。
继续。
那么,你必须每次输入return
。我不知道你收获了什么(或损失)做它,你建议的方式,特别是因为
return
有效地同
return None
但我不知道为什么你有这些空返声明在函数中。有必要吗?在这个函数中可能有一个更优雅或更易于阅读的方式来处理控制流。一个函数中间的随机return
可能很容易错过。
更抽象地说,计算返回语句是衡量函数复杂度的一个很好的粗略启发式;大多数时候,更多的回报意味着更多cyclomatic complexity。根据经常引用的“单次进入,单次退出”的原则,甚至有一派思想坚持在任何给定的功能中只使用return
一次。事实上,我认为“单一入场,单次出境”与“一次回归”不同,对我来说这似乎相当严格,有时也很繁琐。 (更多信息,请参阅this post,这表明“仅返回一次”是基于对SESE的误解)。但总体原则是,更少的陈述对我来说似乎是一个很好的陈述。
从技术上讲,它确实有一个返回值。如果没有返回语句,函数默认返回None。如何使用elif语句?然后你可以调用report_and_set()而不用担心使用return来退出函数。 – 2012-02-05 06:00:27
它可能是*重构时间*,但很难说不知道你的功能是什么。 – 2012-02-05 10:42:46