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

在Python中使用Enum作为字典键时为何出现KeyError?

问题原因与解决办法

核心问题:重复导入导致枚举类实例不匹配

你碰到的KeyError本质是同一个枚举类被加载了两次,生成了完全独立的两个类对象。Helpers模块里的HelperEnum.ValueOne和测试代码里导入的Constants.HelperEnum.ValueOne,虽然名字、枚举值都一致,但它们是内存中不同的对象。而Python字典的键匹配是基于对象身份(is运算符)的,所以会出现找不到键的情况。

导致重复导入的原因是相对导入的路径歧义:

  • Helpers.py用from Constants import HelperEnum导入时,Python加载了Constants模块;
  • Test_Helpers.py用from .. import Constants导入时,因路径解析问题,Python将其视为新模块重新加载,生成了新的HelperEnum类。

解决办法

方法1:统一使用绝对导入

确保项目根目录在Python的sys.path中,然后将测试代码的导入改为和Helpers.py一致的绝对导入:

from Constants import HelperEnum
from Helpers import ClassOne

ClassOne().dictionary[HelperEnum.ValueOne]

方法2:添加项目根目录到Python路径

在Test_Helpers.py开头添加代码,将项目根目录加入sys.path,避免路径解析歧义:

import sys
from pathlib import Path

# 将项目根目录(Tests文件夹的父目录)添加到路径
sys.path.append(str(Path(__file__).parent.parent))

from Constants import HelperEnum
from Helpers import ClassOne

ClassOne().dictionary[HelperEnum.ValueOne]

方法3:改用枚举值作为字典键(临时方案)

如果暂时无法调整导入结构,可以用枚举的value属性作为字典键,绕开对象身份匹配的限制:

  • 修改Helpers.py:
from Constants import HelperEnum

class ClassOne:
    def __init__(self):
        self.dictionary = {HelperEnum.ValueOne.value: "TEMP"}
  • 修改Test_Helpers.py:
from .. import Helpers
from .. import Constants

Helpers.ClassOne().dictionary[Constants.HelperEnum.ValueOne.value]

内容的提问来源于stack exchange,提问作者Henry C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:42:39