2012-02-05 142 views
3

函数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

+0

从技术上讲,它确实有一个返回值。如果没有返回语句,函数默认返回None。如何使用elif语句?然后你可以调用report_and_set()而不用担心使用return来退出函数。 – 2012-02-05 06:00:27

+0

它可能是*重构时间*,但很难说不知道你的功能是什么。 – 2012-02-05 10:42:46

回答

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的时间!

+1

我认为单一入场单出口不同于“单回单”,这看起来相当严格,并且有时很繁重。 [第二个回答](http://programmers.stackexchange.com/a/118793)对你所关联的问题表明“仅一次回报”是基于对SESE的误解。尽管如此,我同意一般情况下,计算“回报”陈述是衡量函数复杂性的一个粗略的启发式;更多的回报=更多[圈复杂度](http://en.wikipedia.org/wiki/Cyclomatic_complexity)。 – senderle 2012-02-05 15:25:09

+1

@senderle:+1一个非常有趣的见解和链接。 – max 2012-02-08 18:00:00

0

是的,可以这样做。

不,没有错。

继续。

2

那么,你必须每次输入return。我不知道你收获了什么(或损失)做它,你建议的方式,特别是因为

return 

有效地同

return None 

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

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

+0

哎呀,是的,我应该澄清,我只保存一个新的路线;当然,我仍然需要输入'return'。你也可以将你的评论移到你的答案,因为它非常有用? – max 2012-02-08 17:58:30

+0

@max,很高兴你觉得它有用!我将它合并到我的答案中。 – senderle 2012-02-08 23:39:09

相关问题