python如何实现相互递归?

wat*_*HUN 9 python interpreted-language function mutual-recursion

转到使用C/Java背景的python,我最近不得不实现相互递归,但python中的某些东西困扰着我:

因为python程序是逐行解释的,如果我在同一个python文件中一个接一个地有两个函数:

def A(n):
    B(n-1)
# if I add A(1) here, it gives me an error
def B(n):
    if n <= 0:
        return
    else:
        A(n-1)
Run Code Online (Sandbox Code Playgroud)

当解释器正在读取时A,B尚未定义,但是此代码不会给我一个错误

TL; DR 我的理解是,当def被解释,蟒蛇增加了一些本地的名称空间中的条目locals(){"function name": function address},但作为函数体,它只能做语法检查:

def A():
    blabla # this will give an error

def B():
    print x # even though x is not defined, this does not give an error
    A()     # same as above, NameError is only detected during runtime
Run Code Online (Sandbox Code Playgroud)

Col*_*Two 5

该行B(n-1)表示“执行此语句时,B在模块范围内查找某个函数,然后使用参数调用它n-1”。由于查找发生在函数执行时,B可以稍后定义。

(此外,您可以B使用不同的函数完全覆盖,然后A再调用新函数B。但这可能会导致一些令人困惑的代码。)

如果您担心不会捕捉到对不存在的函数的调用,您可以尝试使用静态分析工具。除此之外,请确保您正在测试您的代码。


Tig*_*kT3 5

ASyntaxError将在编译时捕获,但大多数其他错误(NameErrorValueError等)将仅在运行时捕获,并且仅在调用该函数时捕获。

“如果我编写了一个函数,如果它在我的测试中没有被调用......” - 这就是为什么你应该测试一切。

有些IDE会在各种情况下发出警告,但最好的选择仍然是自己进行彻底的测试。通过这种方式,您还可以检查因用户输入等因素而产生的错误,而 IDE 的自动检查无法涵盖这些错误。