我正在尝试构建一个自定义类,该类在从字典获取键和/或值时需要它们。这是我编写的 getRequired 的简单版本,仅检查密钥。
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: 'method' object is not subscriptable 当尝试相同的代码时,要访问 'person1' 而不是 'age',会返回值。我的理解是,给出错误是因为嵌套字典没有使用 ExtendedDict 而是使用标准字典。
我正在寻找对此的反馈,或者有人纠正我的理解。感谢您的帮助。
嗯,你有两个问题。首先是一个小语法问题:
extended_nested_dict.getRequired['person1']
# TypeError: 'method' object is not subscriptable
在这里,您正在尝试为一个方法添加下标。您可能想要做的是调用 get required (使用括号,而不是方括号):
extended_nested_dict.getRequired('person1') # OK
另一个问题,我认为这是您真正遇到的主要问题,是您只包装了最外层的字典,但您也希望嵌套字典成为 ExtendedDict
类型。为此,您可以在
__init__
方法中实现它。像这样的东西:
from collections import UserDict
class ExtendedDict(UserDict):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for k, v in self.items():
if isinstance(v, dict):
extended_value = ExtendedDict(v)
self[k] = extended_value
def getRequired(self, key, default=None):
... # same as you had it
然后你可以看到嵌套的字典(无论嵌套多深)也会变成一个ExtendedDict
:
# 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)
person = extended_nested_dict.getRequired('person1')
age = person.getRequired('age')
name = person.getRequired('name')
print(f'{name} is {age} years old')