如何不调用函数即可获取Python嵌套内部函数中定义的变量值
问题解答
首先明确核心前提:Python 中函数内部的代码逻辑仅在函数被调用执行时才会实际运行,对应作用域内的变量也只有这时候才会被创建赋值:
- 你代码里的
func2函数定义本身是写在func1内部的,只有调用func1时才会生成func2这个函数对象 func2内部的str变量的赋值操作,只有调用func2时才会执行,对应的值才会在内存中生成
完全不调用func1和func2的前提下,无法通过正常的运行时变量访问方式拿到这个str的值,只有通过静态解析源代码的方式提取:
方案:静态解析函数源码提取值
可以用inspect模块获取func1的源码,再通过正则匹配提取func2内部的str赋值内容,示例代码如下:
import inspect import re def func1(): def func2(x, y, z): # global str str = "Xin chao`" # func2() #func1() # 获取func1的源码 func1_source = inspect.getsource(func1) # 正则匹配func2内部str的赋值 match = re.search(r'def func2.*?:.*?str\s*=\s*"(.*?)"', func1_source, re.DOTALL) if match: target_str = match.group(1) print("Result:", target_str)
运行后输出结果为:
Result: Xin chao`
调整代码结构的可选方案
如果可以修改原始代码结构,不需要严格限制不调用函数,可选择以下更稳定的实现方式:
# 方案1:常量外提到全局作用域 FUNC2_TARGET_STR = "Xin chao`" def func1(): def func2(x, y, z): str = FUNC2_TARGET_STR print("Result:", FUNC2_TARGET_STR) # 方案2:返回内部函数对象,从函数常量池提取(仅调用func1,不调用func2执行业务逻辑) def func1(): def func2(x, y, z): str = "Xin chao`" return func2 # 仅获取func2对象,不执行func2逻辑 func2_obj = func1() # 从func2的代码常量池中提取对应字符串 target_str = [const for const in func2_obj.__code__.co_consts if isinstance(const, str) and const == "Xin chao`"][0] print("Result:", target_str)
内容的提问来源于stack exchange,提问作者HuyGao_Backend
相关产品推荐
相关产品推荐

