def test_attr_dict(): d = AttrDict() d.x = 1 d.y = {} d.y.z = 2 d.q = AttrDict() d.q.r = 3 d.q.s = AttrDict(AttrDict({})) # I'm just being weird d['q']['s']['t'] = 4 assert d.x == 1 assert d.y.z == d['y']['z'] assert d.y.z == 2 assert d.q.r == d['q']['r'] assert d.q.r == 3 assert d.q.s.t == d['q'].s['t'] # Don't do this in real code. assert isinstance(d, dict) assert isinstance(d.y, dict) assert isinstance(d['y'], dict) assert isinstance(d.q.s, dict) assert isinstance(d['q']['s'], dict) assert isinstance(d.q.s, dict) assert isinstance(d['q']['s'], dict) # We can say AttrDict(AttrDict({'foo': 'bar'})) with no ill effects. e = AttrDict(d) assert e == d assert e.x == 1 assert e.y.z == d['y']['z'] assert e.y.z == 2 assert e.q.r == d['q']['r'] assert e.q.r == 3 assert isinstance(e, dict) assert isinstance(e.y, dict) assert isinstance(e['y'], dict)
def test_attr_dict_kwargs(): """Test that attributes can be set as named arguments""" d = AttrDict(x=0, y=1) assert d.x == 0 assert d.y == 1 #We can stil have an initial document and named values #named values take over. e = AttrDict({'x': 0, 'y': 1}, x=1) assert e.x == 1 assert e.y == 1 #We can pass a dictionary as a value f = AttrDict(x={'a': 1}) assert f.x.a == 1
def test_attr_dict_from_dict(): d = { 'a': 1, 'b': { 'c': 2, 'd': { 'e': 3, 'f': 4, }, 'g': 5, }, 'h': 6, 'i': 7, } attr_dict = AttrDict(d) assert attr_dict.a == 1 assert attr_dict['a'] == 1 assert attr_dict.b.c == 2 assert attr_dict['b'].c == 2 assert attr_dict['b']['c'] == 2 assert attr_dict.b['c'] == 2 assert attr_dict.b.d.e == 3 assert attr_dict['b']['d']['e'] == 3
def test_attrdict_del(): f = AttrDict() f.x = 1 del f.x with pytest.raises(AttributeError): tmp = f.x with pytest.raises(KeyError): tmp = f['x'] f['x'] = 1 del f['x'] with pytest.raises(KeyError): tmp = f['x'] with pytest.raises(AttributeError): tmp = f.x