Skip to content

Commit 6d6de76

Browse files
committed
Fix dict compatibility making keylist feature working only with lists. #412 #432
1 parent 62089a7 commit 6d6de76

File tree

6 files changed

+60
-56
lines changed

6 files changed

+60
-56
lines changed

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ python-benedict is a dict subclass with **keylist/keypath/keyattr** support, **I
3333
- [Usage](#usage)
3434
- [Basics](#basics)
3535
- [Keyattr](#keyattr) `my_dict.x.y.z`
36-
- [Keylist](#keylist) `my_dict["x", "y", "z"]`
36+
- [Keylist](#keylist) `my_dict[["x", "y", "z"]]`
3737
- [Keypath](#keypath) `my_dict["x.y.z"]`
3838
- [Custom keypath separator](#custom-keypath-separator)
3939
- [Change keypath separator](#change-keypath-separator)
@@ -136,16 +136,16 @@ Wherever a **key** is used, it is possible to use also a **list (or a tuple) of
136136
d = benedict()
137137

138138
# set values by keys list
139-
d["profile", "firstname"] = "Fabio"
140-
d["profile", "lastname"] = "Caccamo"
139+
d[["profile", "firstname"]] = "Fabio"
140+
d[["profile", "lastname"]] = "Caccamo"
141141
print(d) # -> { "profile":{ "firstname":"Fabio", "lastname":"Caccamo" } }
142142
print(d["profile"]) # -> { "firstname":"Fabio", "lastname":"Caccamo" }
143143

144144
# check if keypath exists in dict
145-
print(["profile", "lastname"] in d) # -> True
145+
print([["profile", "lastname"]] in d) # -> True
146146

147147
# delete value by keys list
148-
del d["profile", "lastname"]
148+
del d[["profile", "lastname"]]
149149
print(d["profile"]) # -> { "firstname":"Fabio" }
150150
```
151151

benedict/dicts/keylist/keylist_dict.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ def __init__(self, *args, **kwargs):
88
super().__init__(*args, **kwargs)
99

1010
def __contains__(self, key):
11-
if type_util.is_list_or_tuple(key):
11+
if type_util.is_list(key):
1212
return self._contains_by_keys(key)
1313
return super().__contains__(key)
1414

@@ -19,7 +19,7 @@ def _contains_by_keys(self, keys):
1919
return False
2020

2121
def __delitem__(self, key):
22-
if type_util.is_list_or_tuple(key):
22+
if type_util.is_list(key):
2323
self._delitem_by_keys(key)
2424
return
2525
super().__delitem__(key)
@@ -35,7 +35,7 @@ def _delitem_by_keys(self, keys):
3535
raise KeyError(f"Invalid keys: {keys!r}")
3636

3737
def __getitem__(self, key):
38-
if type_util.is_list_or_tuple(key):
38+
if type_util.is_list(key):
3939
return self._getitem_by_keys(key)
4040
return super().__getitem__(key)
4141

@@ -46,7 +46,7 @@ def _getitem_by_keys(self, keys):
4646
raise KeyError(f"Invalid keys: {keys!r}")
4747

4848
def __setitem__(self, key, value):
49-
if type_util.is_list_or_tuple(key):
49+
if type_util.is_list(key):
5050
self._setitem_by_keys(key, value)
5151
return
5252
super().__setitem__(key, value)
@@ -55,7 +55,7 @@ def _setitem_by_keys(self, keys, value):
5555
keylist_util.set_item(self, keys, value)
5656

5757
def get(self, key, default=None):
58-
if type_util.is_list_or_tuple(key):
58+
if type_util.is_list(key):
5959
return self._get_by_keys(key, default)
6060
return super().get(key, default)
6161

@@ -68,7 +68,7 @@ def _get_by_keys(self, keys, default=None):
6868
return default
6969

7070
def pop(self, key, *args):
71-
if type_util.is_list_or_tuple(key):
71+
if type_util.is_list(key):
7272
return self._pop_by_keys(key, *args)
7373
return super().pop(key, *args)
7474

benedict/dicts/keypath/keypath_util.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def parse_keys(keypath, separator):
2626
"""
2727
Parse keys from keylist or keypath using the given separator.
2828
"""
29-
if type_util.is_list_or_tuple(keypath):
29+
if type_util.is_list(keypath):
3030
keys = []
3131
for key in keypath:
3232
keys += parse_keys(key, separator)

tests/dicts/keylist/test_keylist_dict.py

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@ def test_contains(self):
1414
d["a"]["b"] = True
1515
self.assertTrue(["a", "b"] in d)
1616
self.assertFalse(["a", "b", "c"] in d)
17-
# with keys as tuple
18-
self.assertTrue(("a", "b") in d)
19-
self.assertFalse(("a", "b", "c") in d)
2017

2118
def test_delitem(self):
2219
d = KeylistDict()
@@ -27,30 +24,20 @@ def test_delitem(self):
2724
del d[["a", "b", "c"]]
2825
self.assertFalse(["a", "b", "c"] in d)
2926
self.assertTrue(["a", "b"] in d)
30-
# with keys as tuple
31-
del d[("a", "b")]
32-
self.assertFalse(["a", "b"] in d)
33-
self.assertTrue(["a"] in d)
3427

3528
def test_get(self):
3629
d = KeylistDict()
3730
d["a"] = {}
3831
d["a"]["b"] = True
3932
self.assertEqual(d.get(["a", "b"]), True)
4033
self.assertEqual(d.get(["a", "b"]), True)
41-
# with keys as tuple
42-
self.assertEqual(d.get(("a", "b")), True)
43-
self.assertEqual(d.get(("a", "b")), True)
4434

4535
def test_getitem(self):
4636
d = KeylistDict()
4737
d["a"] = {}
4838
d["a"]["b"] = True
4939
self.assertEqual(d[["a", "b"]], True)
5040
self.assertEqual(d[["a", "b"]], True)
51-
# with keys as tuple
52-
self.assertEqual(d[("a", "b")], True)
53-
self.assertEqual(d[("a", "b")], True)
5441

5542
def test_pop(self):
5643
d = KeylistDict()
@@ -61,10 +48,6 @@ def test_pop(self):
6148
d.pop(["a", "b", "c"])
6249
self.assertFalse(["a", "b", "c"] in d)
6350
self.assertTrue(["a", "b"] in d)
64-
# with keys as tuple
65-
d.pop(("a", "b"))
66-
self.assertFalse(["a", "b"] in d)
67-
self.assertTrue(["a"] in d)
6851

6952
def test_set(self):
7053
# TODO

tests/dicts/keypath/test_keypath_dict.py

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -334,17 +334,11 @@ def test_get_item_with_keys_list(self):
334334
},
335335
}
336336
b = KeypathDict(d)
337-
self.assertEqual(b["a", "b.c"], 1)
338337
self.assertEqual(b[["a", "b.c"]], 1)
339-
self.assertEqual(b[("a", "b.c")], 1)
340-
self.assertEqual(b["a", "b", "c"], 1)
341338
self.assertEqual(b[["a", "b", "c"]], 1)
342-
self.assertEqual(b[("a", "b", "c")], 1)
343-
self.assertEqual(b["a", "b", "d"], 2)
344339
self.assertEqual(b[["a", "b", "d"]], 2)
345-
self.assertEqual(b[("a", "b", "d")], 2)
346340
with self.assertRaises(KeyError):
347-
_ = b["a", "b", "e"]
341+
_ = b[["a", "b", "e"]]
348342

349343
def test_get_item_with_keys_list_and_no_keypath_separator(self):
350344
d = {
@@ -357,16 +351,12 @@ def test_get_item_with_keys_list_and_no_keypath_separator(self):
357351
}
358352
b = KeypathDict(d, keypath_separator=None)
359353
with self.assertRaises(KeyError):
360-
_ = b["a", "b.c"]
354+
_ = b[["a", "b.c"]]
361355

362-
self.assertEqual(b["a", "b", "c"], 1)
363356
self.assertEqual(b[["a", "b", "c"]], 1)
364-
self.assertEqual(b[("a", "b", "c")], 1)
365-
self.assertEqual(b["a", "b", "d"], 2)
366357
self.assertEqual(b[["a", "b", "d"]], 2)
367-
self.assertEqual(b[("a", "b", "d")], 2)
368358
with self.assertRaises(KeyError):
369-
_ = b["a", "b", "e"]
359+
_ = b[["a", "b", "e"]]
370360

371361
def test_has_with_1_key(self):
372362
d = {
@@ -516,13 +506,13 @@ def test_setitem_with_keys_list(self):
516506
},
517507
}
518508
b = KeypathDict(d)
519-
b["a", "b.c"] = 2
509+
b[["a", "b.c"]] = 2
520510
self.assertEqual(b["a.b.c"], 2)
521-
b["a", "b", "c"] = 3
511+
b[["a", "b", "c"]] = 3
522512
self.assertEqual(b["a.b.c"], 3)
523-
b["a", "b", "d"] = 4
513+
b[["a", "b", "d"]] = 4
524514
self.assertEqual(b["a.b.d"], 4)
525-
b["a", "b", "e"] = 5
515+
b[["a", "b", "e"]] = 5
526516
self.assertEqual(b["a.b.e"], 5)
527517

528518
def test_setitem_with_keys_list_and_no_keypath_separator(self):
@@ -535,20 +525,20 @@ def test_setitem_with_keys_list_and_no_keypath_separator(self):
535525
},
536526
}
537527
b = KeypathDict(d, keypath_separator=None)
538-
b["a", "b", "c"] = 3
528+
b[["a", "b", "c"]] = 3
539529
with self.assertRaises(KeyError):
540530
_ = b["a.b.c"]
541-
self.assertEqual(b["a", "b", "c"], 3)
531+
self.assertEqual(b[["a", "b", "c"]], 3)
542532

543-
b["a", "b", "d"] = 4
533+
b[["a", "b", "d"]] = 4
544534
with self.assertRaises(KeyError):
545535
_ = b["a.b.d"]
546-
self.assertEqual(b["a", "b", "d"], 4)
536+
self.assertEqual(b[["a", "b", "d"]], 4)
547537

548-
b["a", "b", "e"] = 5
538+
b[["a", "b", "e"]] = 5
549539
with self.assertRaises(KeyError):
550540
_ = b["a.b.e"]
551-
self.assertEqual(b["a", "b", "e"], 5)
541+
self.assertEqual(b[["a", "b", "e"]], 5)
552542

553543
def test_setitem_with_dict_value_with_separator_in_keys(self):
554544
d = {
@@ -668,8 +658,8 @@ def test_delitem_with_keys_list(self):
668658
}
669659
b = KeypathDict(d)
670660
with self.assertRaises(KeyError):
671-
del b["a", "b", "c", "d"]
672-
del b["a", "b", "c"]
661+
del b[["a", "b", "c", "d"]]
662+
del b[["a", "b", "c"]]
673663
self.assertEqual(b.get("a.b.c", 3), 3)
674664

675665
def test_delitem_with_keys_list_and_no_keypath_separator(self):
@@ -683,8 +673,8 @@ def test_delitem_with_keys_list_and_no_keypath_separator(self):
683673
}
684674
b = KeypathDict(d, keypath_separator=None)
685675
with self.assertRaises(KeyError):
686-
del b["a", "b", "c", "d"]
687-
del b["a", "b", "c"]
676+
del b[["a", "b", "c", "d"]]
677+
del b[["a", "b", "c"]]
688678
self.assertEqual(b.get("a.b.c", 3), 3)
689679

690680
def test_pop_default(self):

tests/github/test_issue_0432.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import unittest
2+
from benedict import benedict
3+
4+
5+
class github_issue_0432_test_case(unittest.TestCase):
6+
"""
7+
This class describes a github issue 0432 test case.
8+
https://github.com/fabiocaccamo/python-benedict/issues/432
9+
10+
To run this specific test:
11+
- Run python -m unittest tests.github.test_issue_0432
12+
"""
13+
14+
def test_tuple_as_key_like_dict_432(self):
15+
d1 = {}
16+
d2 = benedict()
17+
d1[(0, 0, 1)] = "a"
18+
d2[(0, 0, 1)] = "a"
19+
self.assertEqual(d1, d2)
20+
21+
def test_tuple_as_key_like_dict_412(self):
22+
d = {}
23+
d[("a", True)] = "test"
24+
25+
b1 = benedict()
26+
b1[("a", True)] = "test"
27+
self.assertEqual(d, b1)
28+
29+
b2 = benedict()
30+
b2.update({("a", True): "test"})
31+
self.assertEqual(d, b2)

0 commit comments

Comments
 (0)