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)
该行B(n-1)
表示“执行此语句时,B
在模块范围内查找某个函数,然后使用参数调用它n-1
”。由于查找发生在函数执行时,B
可以稍后定义。
(此外,您可以B
使用不同的函数完全覆盖,然后A
再调用新函数B
。但这可能会导致一些令人困惑的代码。)
如果您担心不会捕捉到对不存在的函数的调用,您可以尝试使用静态分析工具。除此之外,请确保您正在测试您的代码。
ASyntaxError
将在编译时捕获,但大多数其他错误(NameError
、ValueError
等)将仅在运行时捕获,并且仅在调用该函数时捕获。
“如果我编写了一个函数,如果它在我的测试中没有被调用......” - 这就是为什么你应该测试一切。
有些IDE会在各种情况下发出警告,但最好的选择仍然是自己进行彻底的测试。通过这种方式,您还可以检查因用户输入等因素而产生的错误,而 IDE 的自动检查无法涵盖这些错误。
归档时间: |
|
查看次数: |
1656 次 |
最近记录: |