在if / else语句中使用函数return

时间:2016-01-17 10:05:28

标签: python if-statement

我想让我的代码看起来更好 例如:

result = somefunction()
if result == what_i_need:
    do_something()
else:
    print 'that\'s not what i need', result

我正在尝试做这样的事情:

if somefunction() == what_i_need:
    do_something()
else:
    print 'that\'s not what i need', <return value of somefunction>

这可能吗?

2 个答案:

答案 0 :(得分:4)

这是你可以在技术上尝试的东西,但不应该:

def somefunction():
    val = 3 # calculate value
    globals()['somefunction_return'] = val # store it in globals() first
    return val # return as normal

def do_something():
    print 'got it'

what_i_need = 3

if somefunction() == what_i_need:
    do_something()
    print 'that\'s not what i need', somefunction_return

# result:
#
# got it
# that's not what i need 3

你为什么不这样做?

  1. 分配仍在其他地方进行,因此所做的一切就是将不需要的代码扫除。不要理会窗帘后面的垃圾。
  2. globals()混淆比你已经做过的简单任务更脆弱,部分原因是开发人员更难以避免绊倒它。
  3. 它引入了一种叫做“副作用”的东西,这是一个函数不会这么说的额外事件。在此示例中,somefunction除了计划的目的之外还在做一些事情,而不会做广告。这使得代码更难维护。
  4. 它使代码更难以阅读和遵循,这违背了Python的意图。想象一下有人正在阅读上面的if结构。他们怎么知道somefunction_return来自哪里?他们必须查看每行代码,直到他们在somefunction中发现了令人讨厌的副作用。我们甚至可能将其命名为其他内容,例如my_foobar_value,然后读者甚至不会提示他们应该检查somefunction
  5. 请继续使用您已有的普通作业。

答案 1 :(得分:2)

不,在Python中捕获函数返回值的唯一合理方法是将其显式赋值给变量。

即使有一个设备通过隐式方式引用前一个函数的返回值,Python文化也会厌恶这种事情。一个经常被引用的Python原则是“显式优于隐式”。