python如何实现互递归?

How does python implement 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)

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

我的理解是,当 def 被解释时,python 添加一个条目到一些本地名称 space 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

B(n-1) 表示 "when this statement is executed, lookup some function B in the module scope, then call it with parameters n-1"。由于查找发生在函数执行时,B可以稍后定义。

(此外,您可以用不同的函数完全覆盖 BA 之后会调用新的 B。但这会导致一些混乱的代码。)

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

A​​ SyntaxError 将在编译时被捕获,但大多数其他错误(NameErrorValueError 等)将仅在运行时被捕获,然后仅当函数被调用。

"if I have written a function, if its not called in my test.." - 这就是为什么你应该测试一切。

有些IDE会在各种情况下发出警告,但最好的选择还是自己进行彻底测试。这样,您还可以检查因用户输入等因素引起的错误,IDE 的自动检查不会涵盖这些错误。

When the interpreter is reading A, B is not yet defined, however this code does not give me an error

python解释器不报错的原因,技术上可以从docs, which is called forward reference找到:

Name resolution of free variables occurs at runtime, not at compile time.