代码之家  ›  专栏  ›  技术社区  ›  mountainmantra

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

  •  0
  • mountainmantra  · 技术社区  · 2 周前

    我正在尝试构建一个自定义类,当从dict中获取密钥和/或值时,该类将需要它们。这是我所写的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”对象不可下标当尝试相同的代码时,要访问“person1”而不是“age”,将返回值。我的理解是,之所以出现错误,是因为嵌套字典没有使用ExtendedDict,而是使用了标准字典。

    我正在寻求对此的反馈,或者有人来纠正我的理解。谢谢你的帮助。

    1 回复  |  直到 2 周前
        1
  •  0
  •   sytech    2 周前

    你有两个问题。第一个是一个小的语法问题:

    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
    
    # use UserDict to avoid subclassing issues with the builtin type
    
    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
    

    然后你可以看到嵌套的字典(无论嵌套有多深)也会变成 扩展的Dict :

    # 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')
    
    assert type(person) is ExtendedDict  # True
    

    如果您还想在其他嵌套集合(如列表、元组等)中使用,则需要进行一些额外的调整。