如何创建在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
相关产品推荐
相关产品推荐

