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

如何创建在get()时校验键/值的扩展字典类?遇TypeError问题求助

解决自定义字典类嵌套访问的TypeError问题

我想构建一个带键校验功能的自定义字典类,写了一个简化的getRequired方法来实现键不存在时抛错的逻辑,但运行代码时抛出TypeError: 'method' object is not subscriptable错误。原代码如下:

class ExtendedDict(dict):
    def getRequired(self, key, default=None):
        """
        Custom get method that raises an error if the key is not found.
        """
        if key in self:
            return self[key]
        elif default is not None:
            return default
        else:
            raise KeyError(f"Key '{key}' not found in the dictionary")

# Create a nested dictionary
nested_dict = {
    'person1': {'name': 'Alice', 'age': 30},
    'person2': {'name': 'Bob', 'age': 25},
    'person3': {'name': 'Charlie', 'age': 40}
}

# Create an instance of ExtendedDict
extended_nested_dict = ExtendedDict(nested_dict)

# Access 'age' for 'person1' using getRequired
try:
    alice_age = extended_nested_dict.getRequired['person1'].getRequired('age')
    print(f"Alice's age: {alice_age}")
except KeyError as e:
    print(e)

错误原因分析

  • 直接触发TypeError的原因:你用了方括号[]调用getRequired方法,但Python中方法必须用圆括号()传递参数,方括号仅适用于可下标对象(比如列表、字典)。
  • 嵌套访问的潜在问题:你判断的没错,嵌套的子字典是标准dict类型,没有getRequired方法,就算修复语法,后续调用子字典的getRequired也会报错。

修复方案

步骤1:修正方法调用语法

把extended_nested_dict.getRequired['person1']改为extended_nested_dict.getRequired('person1'),这是解决当前TypeError的核心步骤。

步骤2:让嵌套字典自动转为ExtendedDict类型

重写__getitem__方法,当取值为字典时自动包装成ExtendedDict实例,确保嵌套层级的字典也能使用自定义方法:

class ExtendedDict(dict):
    def getRequired(self, key, default=None):
        """
        Custom get method that raises an error if the key is not found.
        """
        if key in self:
            return self[key]
        elif default is not None:
            return default
        else:
            raise KeyError(f"Key '{key}' not found in the dictionary")
    
    def __getitem__(self, key):
        # 获取值后,若为普通dict则转为ExtendedDict
        value = super().__getitem__(key)
        if isinstance(value, dict) and not isinstance(value, ExtendedDict):
            return ExtendedDict(value)
        return value

# Create a nested dictionary
nested_dict = {
    'person1': {'name': 'Alice', 'age': 30},
    'person2': {'name': 'Bob', 'age': 25},
    'person3': {'name': 'Charlie', 'age': 40}
}

# Create an instance of ExtendedDict
extended_nested_dict = ExtendedDict(nested_dict)

# Access 'age' for 'person1' using getRequired
try:
    alice_age = extended_nested_dict.getRequired('person1').getRequired('age')
    print(f"Alice's age: {alice_age}")
except KeyError as e:
    print(e)

代码说明

  • 重写__getitem__后,每次通过self[key]或getRequired返回字典类型的值时,都会自动转为ExtendedDict实例。
  • 加入not isinstance(value, ExtendedDict)判断,避免重复包装已经是ExtendedDict的对象,提升效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:06:05