You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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()的作用范围不同。

解决方法

需要把字符串形式的属性路径拆分成对象名和属性名,分步获取值:

  1. 按.分割var_name,将'avatar.corruption'拆分为['avatar', 'corruption']
  2. 先从globals()中获取根对象(如avatar)
  3. 通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:05:06