基于另一个函数调用自动从函数返回

时间:2017-08-10 10:49:11

标签: python function

假设我将函数myFunc定义为

def myFunc(value):
    return value if isinstance(value, int) else None

现在,在我的项目中,我使用myFunc,如果从myFunc返回的值为None,则封闭的函数应自动返回,如果返回某个整数值则应该继续

例如:

def dumbFunc():

    # some code
    # goes here..

    result = myFunc('foo')

    # some code
    # goes here..

此功能应自动表现为..

def dumbFunc():

    # some code
    # goes here..

    result = myFunc('foo')
    if not result:
        return

    # some code
    # goes here..

PS - 我不知道这件事是否可能。

3 个答案:

答案 0 :(得分:3)

这根本不可能。

除了异常之外,您无法为被调用函数提供影响调用范围控制流的能力。因此,函数调用foo()可以永远不会中断控制流而不会抛出异常。作为函数的使用者,您(调用函数)始终有责任自行处理此类情况并决定您自己的控制流程。

这样做是一个非常好的主意。只是函数调用可能会中断我的控制流而没有可能对它做出反应的可能性首先听起来像是一场纯粹的噩梦。仅仅为了释放和清理资源的能力,控制流程不是从我这里获取是非常重要的。

异常是一个值得注意的例外,但当然这是一个根深蒂固的语言特性,仍然让我有能力对其采取行动(通过捕获异常,甚至通过最终阻止执行清理任务)。例外故意不是沉默,而是非常响亮,因此确定性控制流程的中断清晰可见,并且在正确处理时影响最小。

但是有一个既不提供任何控制也不提供任何反馈的沉默特征只是一个可怕的想法。

  

如果在我的项目中的100个地方使用myFunc,我需要在其后面放置一个if条件。

如果您的代码类似于那样,您只需从任何调用myFunc的函数中返回任何内容,而无需执行任何,那么您要么构建一个不切实际的幻想项目,要么就是您我们根本不知道这会对以这种方式返回的函数的调用代码产生什么影响。

答案 1 :(得分:1)

好吧,我会咬人。

一方面,这是不可能的。如果你想检查某些内容,你必须在代码中加一行来检查它。

有几种方法可以达到这样的效果,但我认为你可能已经找到了最好的方法。

你已经有了这个功能:

def myFunc(value):
    return value if isinstance(value, int) else None

我可能会这样做:

def myFunc(value):
    return isinstance(value, int)

但无论哪种方式都可以使用它:

def dumb_func():
    value = do_something()
    if myFunc(value):
        return
    do_more()
    return value

或者,您可以使用tryexcept

我会提出一个TypeError,因为这似乎是你正在检查的内容:

def myFunc(value):
    if not isinstance(value, int):
        raise TypeError('myFunc found that {} is not an int'.format(value))

然后你可以这样使用

def dumb_func():
    value = do_something()
    try:
        myFunc(value):
    Except TypeError as e:
        print e # some feedback that this has happened, but no error raised
        return
    do_more()
    return value

对于奖励积分,你可以定义一个自定义异常(这是更安全的,因为当你捕获到特定错误时,你知道它不是由代码中的任何其他东西引发的,如果你这样做,你可能会更懒,例如:)

Class CustomTypeError(TypeError):
    pass

def dumb_func():
    try:
        value = do_something()
        myFunc(value):
        do_more()
        return value
    Except CustomTypeError as e:
        print e # some feedback that this has happened, but no error raised
        return

但是这一切都没有解决这个问题:如果你想根据测试结果采取行动,你必须检查结果。

答案 2 :(得分:0)

Python有一个ternary conditional operator,你使用的语法是正确的,所以这将起作用:

def myFunc(value):
    return value if isinstance(value, int) else None

def dumbFunc():
  print("Works?")
  result = myFunc(5)
  print(result)

dumbFunc()

结果:

Works?
5
  

我希望函数在这种情况下自动返回

这是不可能的。要做到这一点,你必须检查myFunc()的返回值并对其采取行动。

PS:你可以goto语句做到这一点,但幸运的是,doesn't support this functionality