如何动态获取函数变量?函数参数与变量需一致的代码执行报错排查
解决动态创建变量时的NameError问题,同时保持参数与变量名一致
首先,咱们来拆解下你代码里的问题根源:当循环执行到i='GetA'时,exec(f"{i}=func({i})")会被解析成GetA=func(GetA)——这时候右边的GetA还完全没被创建出来,Python自然会抛出NameError,它找不到这个未定义的变量。
你想要实现的是让函数参数和最终生成的变量名一致,核心其实是要把变量名的字符串本身传给func,而不是试图引用还不存在的变量。下面给你两种可行的解决方案:
方案一:修改exec的字符串,传递字符串参数
直接给func的参数加上引号,让它接收变量名对应的字符串常量,这样就不会出现未定义的问题,同时也能保持参数和变量名一致:
def func(i): return i for i in ['GetA', 'GetB', 'GetC']: # 给参数添加引号,将变量名字符串传入func exec(f"{i}=func('{i}')") print(GetA) # 输出: GetA print(GetB) # 输出: GetB print(GetC) # 输出: GetC
执行时,exec里的代码会变成GetA=func('GetA'),右边的'GetA'是合法的字符串常量,不存在未定义问题,最终生成的变量值也和变量名完全一致。
方案二:用字典替代exec(更安全的推荐方案)
虽然exec能解决问题,但它的安全性和可读性都不算理想,Python里更规范的做法是用字典来管理这些动态生成的“变量”:
def func(i): return i # 创建字典存储动态生成的结果 result_dict = {} for i in ['GetA', 'GetB', 'GetC']: result_dict[i] = func(i) # 通过字典键访问对应的“变量” print(result_dict['GetA']) # 输出: GetA print(result_dict['GetB']) # 输出: GetB print(result_dict['GetC']) # 输出: GetC
这种方式避免了直接修改全局/局部命名空间,代码逻辑更清晰,也不会有exec带来的潜在安全风险(比如如果i的内容包含恶意代码时)。
内容的提问来源于stack exchange,提问作者Pokeya
相关产品推荐
相关产品推荐

