如何创建需要 get() 上的键/值的扩展 dict 类

问题描述 投票:0回答:1

我正在尝试构建一个自定义类,该类在从字典获取键和/或值时需要它们。这是我编写的 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 而是使用标准字典。

我正在寻找对此的反馈,或者有人纠正我的理解。感谢您的帮助。

python-3.x dictionary class typeerror
1个回答
0
投票

嗯,你有两个问题。首先是一个小语法问题:

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')
    
© www.soinside.com 2019 - 2024. All rights reserved.