Skip to content

AttrDict doesn't handle list properly #35

@anton-tagunov

Description

@anton-tagunov

Example:

        d = AttrDict({"a": 1, "b": 2, "c": {"d": 3, "e": [4, 5, {"f": 6, "g": 7}]}})
        self.assertEqual(d.c.e[2].f, 6) # AttributeError: 'dict' object has no attribute 'f'

I suggest to change AttrDict.setitem:

    def __convert_value__(self, value):
        if isinstance(value, dict):
            return AttrDict(value)
        elif isinstance(value, (list, tuple)):
            return [self.__convert_value__(v) for v in value]
        return value

    def __setitem__(self, key, value):
        # Coerce all nested dict-valued fields into AttrDicts
        return super(AttrDict, self).__setitem__(key, self.__convert_value__(value))



My tests:
    def test_attrdict(self):
        d = AttrDict({"a": 1, "b": 2, "c": {"d": 3, "e": [4, 5, {"f": 6, "g": 7}]}})
        self.assertEqual(d.a, 1)
        self.assertEqual(d.b, 2)
        self.assertEqual(d.c.d, 3)
        self.assertEqual(d.c.e[2].f, 6)
        self.assertEqual(d.c.e[2].g, 7)

        with self.assertRaises(AttributeError):
            a = d.qq


        d = AttrDict({"c": [{"f": 6, "g": 7}, [{"a": 1}]]})
        self.assertEqual(d.c[1][0], 1)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions