python - "Deep return"一路回到第一次函数调用

标签 python function return

假设我有两个(或更多)函数。一个是更高级别的,通过调用不同的其他函数来处理东西。如果其中一个函数失败(例如数学错误),我不仅要“中止”该函数,还要“中止”调用它的函数。在我的例子中,我需要这个来避免错误并避免完成所有计算的其余部分,而不退出整个过程(这也会终止我的 GUI)。相反,我希望脚本继续运行,但回到最上层。

这是我原来问题的抽象:

def levelA(x):
    xx = levelB(x=x)
    xx *= 2
    return xx

def levelB(x):
    if x==0: return
    y = 10 / x
    return y

x = 0
print (levelA(x=x))

当 10 除以 x 时,用值 0 初始化 x 会导致 levelB 崩溃。所以我首先确保 x 不同于 0。如果不是,则通过调用 return 中止该函数。现在 levelA 想要继续将 levelB 的结果加倍,在 x=0 的情况下,它是“None”,我们在那里去另一个崩溃。

当然,我能做的就是插入一行

if xx is None: return

在执行 xx *= 2 之前。但在我的真实情况下,不只是一个额外的级别,而是 2 甚至 3 个,并且调用了许多不同的函数。我想避免检查函数的每个输出是否有错误。

所以我的问题是:我能否以某种方式一直回到第一个函数调用并跳过中间的函数调用?类似“深度回归”的东西?

最佳答案

异常是为了处理您描述的情况而发明的。所以,例如:

In [72]: def f1(x):
    ...:     return f2(x)
    ...:

In [73]: def f2(x):
    ...:     return f3(x)
    ...:

In [74]: def f3(x):
    ...:     if x > 0:
    ...:         return x
    ...:     else:
    ...:         raise ValueError("f3 called with negative argument")
    ...:

In [75]: try:
    ...:     print(f1(-2))
    ...: except ValueError as e:
    ...:     print(e)
    ...:
f3 called with negative argument

关于python - "Deep return"一路回到第一次函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45920002/

相关文章:

javascript - 多次更改 onclick() 函数(背景图像更改)

python - 函数返回的不是预期值 "None"

c - Typedef 结构返回的值与 C 中存储的值不同

python - 嵌套的 json 字段上的 Django order_by

python - 无法使用Python连接简单的国际空间站api

function - 如何在满足 if 条件时重新启动函数

perl - 返回 boolean 值的 Perl 函数实际上返回什么

python - pip 安装 libxml2 失败

python - 单击下拉选项并在 Django 中显示特定字段

c++字符串,构建删除字符 'b'并将字符 'a'替换为两个 'd'的函数