Python嵌套函数调用方法、闭包判定咨询及inspect库疑问
嘿,我来帮你一步步拆解这两个问题!
如何调用
inner_function? 首先得指出你这段代码里的关键问题:outer_function执行到sys.exit()时会直接终止程序,正常情况下你还没机会拿到inner_function,程序就已经退出了。要调用它,有两种可行思路:
方法一:修改原代码(最推荐)
调整outer_function的逻辑,让它返回内部的inner_function,同时注意sys.exit()的位置(如果必须保留,得把返回语句放在它之前,否则程序直接退出拿不到函数):
import sys def outer_function(): def inner_function(): print('inner message') print('outer message') # 先返回内部函数,再退出(不需要退出的话可以直接删掉sys.exit()) return inner_function sys.exit() # 这行永远不会执行,因为return已经终止了函数 # 调用方式1:先获取内部函数,再调用 inner_func = outer_function() inner_func() # 调用方式2:链式直接调用 outer_function()()
方法二:用inspect库(偏hack,不推荐常规场景)
如果完全不想修改原代码,可以通过inspect库提取outer_function的源代码,解析出inner_function的定义再执行:
import sys import inspect def outer_function(): def inner_function(): print('inner message') print('outer message') sys.exit() # 获取outer_function的源代码 outer_src = inspect.getsource(outer_function) # 拆分出inner_function的代码部分 inner_code_part = outer_src.split('def inner_function():')[1].split('print(\'outer message\')')[0].strip() # 拼接成完整的inner_function定义 full_inner_code = f'def inner_function():\n {inner_code_part}' # 执行这段代码定义函数 exec(full_inner_code) # 现在就能调用了 inner_function()
这段代码是否符合闭包的定义?
答案是不符合。闭包有两个核心判定条件:
- 内部函数引用了外部函数作用域中的变量(也就是“自由变量”);
- 外部函数返回这个内部函数,使得内部函数在外部函数执行结束后,仍能保留对外部变量的引用。
你的代码里,inner_function没有引用outer_function的任何变量,而且outer_function也没有返回inner_function——甚至还没等返回就直接退出程序了。举个标准闭包的例子对比:
def outer_function(greeting): # inner_function引用了外部的greeting变量 def inner_function(name): print(f'{greeting}, {name}!') # 外部函数返回内部函数 return inner_function # 创建闭包实例 say_hello = outer_function('Hello') # 此时outer_function已执行完毕,但inner_function仍能访问greeting say_hello('Alice') # 输出:Hello, Alice!
这样的代码才符合闭包的定义。
内容的提问来源于stack exchange,提问作者Dart Feld
相关产品推荐
相关产品推荐

