How does python implement mutual recursion?

▼魔方 西西 提交于 2019-12-14 00:18:59

问题


Moving to python with C/Java background, I recently had to implement a mutual recursion, but something in python is bothering me:

since a python program is interpreted line by line, if I have two functions one after another in the same python file:

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)

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

TL;DR My understanding is that, when def is interpreted, python adds an entry to some local name space locals() with {"function name": function address}, but as for the function body, it only do a syntax check:

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

回答1:


A SyntaxError will be caught at compile time, but most other errors (NameError, ValueError, etc.) will be caught only at runtime, and then only if that function is called.

"if I have written a function, if its not called in my test.." - and that is why you should test everything.

Some IDEs will raise warnings in various situations, but the best option is still to conduct thorough testing yourself. This way, you can also check for errors that arise through factors like user input, which an IDE's automated checks won't cover.




回答2:


The line B(n-1) says "when this statement is executed, lookup some function B in the module scope, then call it with parameters n-1". Since the lookup happens when the function is executed, B can be defined later.

(Additionally, you can completely overwrite B with a different function, and A will call the new B afterwards. But that can lead to some confusing code.)

If you're worried about not catching calls to nonexistent functions, you can try using static analysis tools. Other than that, be sure you're testing your code.




回答3:


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

The reason why python interpreter doesn't give an error can be found from docs, which is called forward reference technically:

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



来源:https://stackoverflow.com/questions/33026506/how-does-python-implement-mutual-recursion

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!