Python前置引用函数报错原因及将函数列表置于脚本顶部的实现方法
问题1:第一段代码无法正常运行的具体原因
Python脚本会自上而下逐行执行顶层代码,所有无缩进、不属于函数/类的顶层代码会在脚本加载时立即求值:
- 第一段代码的第一行就是顶层变量
_FUNCTIONS的定义,执行这一行时,_foo和_bar两个函数还没有被后续的def语句定义,因此直接抛出NameError。 - 第二段代码里
(_foo, _bar)写在myfunc函数内部,函数体内的代码只有在函数被调用时才会求值。你调用myfunc()的位置在_foo、_bar的定义之后,此时这两个函数已经完成声明,因此不会报错。
问题2:将函数列表提取为变量放在脚本顶部的实现方案
有两种常用的稳定实现方式:
方案1:顶层变量延迟赋值
先在顶部声明变量,等所有目标函数定义完成后再给变量赋值,示例代码如下:
# 脚本顶部先声明变量 _FUNCTIONS = None def myfunc(): for f in _FUNCTIONS: print(f()) def _foo(): return False def _bar(): return True # 所有函数定义完成后给顶部的变量赋值 _FUNCTIONS = (_foo, _bar) myfunc()
方案2:把函数列表封装为函数返回值
如果要在顶部就完成完整的变量定义,可以把列表包装成调用时才返回的方法,避免提前求值:
# 脚本顶部定义获取函数列表的方法 def _get_functions(): return (_foo, _bar) def myfunc(): for f in _get_functions(): print(f()) def _foo(): return False def _bar(): return True myfunc()
内容的提问来源于stack exchange,提问作者Dejan
相关产品推荐
相关产品推荐

