使用globals()获取Ren'Py游戏变量值时触发KeyError问题排查
问题:Ren'Py中通过字符串获取对象属性失败
我正在为Ren'Py游戏编写一个简单mod,用于显示“隐藏”变量。这类变量的信息存储在字典列表中,示例如下:
icm_data_rowan = [ { 'name' : 'Rowan corruption', 'var_name' : 'avatar.corruption' # Variable's name in the game # Other keys/values }, # Other variables ]
我编写了一个Python函数用于获取这些变量的值,并拼接成字符串在Ren'Py界面中显示:
def icm_refresh_content(): global icm_txt icm_txt = '' icm_data = ICM_data() # Class I'm keeping my variables icm_content = icm_data.icm_choose_data(icm_content_to_show) # Function to choose a variables list to show (works fine) for entry in icm_content: # print('entry['var_name']') # Testing try: icm_var = globals()[entry['var_name']] # That seems to be a problem! except KeyError: icm_var = 'NA' icm_txt += '{b}' + entry['name'] + ': {color=#FBD315}' + str(icm_var) + '{/color}{/b}{p}'
但该函数总是触发KeyError,导致icm_var被设为'NA'(错误信息:KeyError: 'avatar.corruption')。我期望能正确获取游戏中的变量值,在Ren'Py控制台中直接输入变量名(如avatar.corruption)可得到正确值,打印entry['var_name']也能输出正确的变量名称。请问globals()[entry['var_name']]存在什么问题?我哪里操作有误?
问题原因与解决办法
核心问题
globals()字典仅存储顶级全局变量的直接名称,比如avatar这个对象本身会在globals()里,但avatar.corruption是avatar对象的属性,并非独立的全局变量,因此用globals()['avatar.corruption']找不到对应键,触发KeyError。而Ren'Py控制台能直接解析avatar.corruption,是因为它会自动处理属性访问的语法逻辑,和Python原生globals()的作用范围不同。
解决方法
需要把字符串形式的属性路径拆分成对象名和属性名,分步获取值:
- 按
.分割var_name,将'avatar.corruption'拆分为['avatar', 'corruption'] - 先从
globals()中获取根对象(如avatar) - 通过
getattr()函数逐层获取属性值
修改后的代码示例:
def icm_refresh_content(): global icm_txt icm_txt = '' icm_data = ICM_data() icm_content = icm_data.icm_choose_data(icm_content_to_show) for entry in icm_content: var_path = entry['var_name'] try: # 拆分属性路径 parts = var_path.split('.') # 获取根对象 current_obj = globals()[parts[0]] # 逐层遍历获取属性 for part in parts[1:]: current_obj = getattr(current_obj, part) icm_var = current_obj except (KeyError, AttributeError): # 捕获变量不存在或属性不存在的情况 icm_var = 'NA' icm_txt += '{b}' + entry['name'] + ': {color=#FBD315}' + str(icm_var) + '{/color}{/b}{p}'
补充说明
- 该代码支持多层级属性路径(如
a.b.c.d)的解析 - 新增
AttributeError捕获,避免对象不存在目标属性时报错
内容的提问来源于stack exchange,提问作者Margo
相关产品推荐
相关产品推荐

