大家圣诞快乐,
我正在实现一个允许属性访问的自定义字典,例如dct.attribute. 字典可以嵌套,所以dct.nested_dct.attribute也应该是可能的。这已经很好用了,除了星-星解包。我想我能够用代码而不是文字来表达我想要做的更好的事情。所以这是我正在写的课程。测试应该很清楚地解释它的作用:
class DotDict(dict):
def __getattr__(self, item):
return self.__getitem__(item)
def __getitem__(self, item):
item = super().__getitem__(item)
if isinstance(item, dict):
return self.__class__(item)
return item
class TestDotDict:
@pytest.fixture
def dot_dict(self):
input_dict = dict(
a=1,
b=dict(
c=2,
d=3,
)
)
return DotDict(input_dict)
def test_can_access_by_dot(self, dot_dict):
assert dot_dict.a == 1
def test_returned_dicts_are_dot_dicts(self, dot_dict):
b_dict = dot_dict["b"]
assert isinstance(b_dict, DotDict)
assert b_dict.c == 2
def test_getting_item_also_returns_dot_dicts(self, dot_dict):
b_dict = dot_dict["b"]
assert isinstance(b_dict, DotDict)
assert b_dict.c == 2
def test_unpack_as_function_arguments_yields_dot_dicts_for_children(self, dot_dict):
# this is failing
def checker(a, b):
assert a == 1
assert b.c == 2
checker(**dot_dict)
如评论中所述,最后一次测试失败。有人知道如何解决吗?
按照这个问题的答案:star unpacking for own classes,我想我需要继承collections.abc.Mappingand dict。然而,这并没有解决问题。
我在想这可能与我不太清楚的 MRO 有关。但是无论我是否将类定义更改为
class DotDict(Mapping, item):
或者
class DotDict(item, Mapping):
我的测试不会变成绿色。
慕娘9325324
肥皂起泡泡
守着星空守着你
相关分类