Skip to content

Commit f4424f6

Browse files
committed
raise error when parsing dict with duplicate keys
1 parent 0d4776c commit f4424f6

File tree

2 files changed

+12
-2
lines changed

2 files changed

+12
-2
lines changed

fgpyo/util/inspect.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,10 @@ def dict_parse(dict_string: str) -> Dict[Any, Any]:
217217
len(inner_splits) % 2 == 0
218218
), "Inner splits of dict didn't have matched key val pairs"
219219
for i in range(0, len(inner_splits), 2):
220-
out_dict[key_parser(inner_splits[i])] = val_parser(inner_splits[i + 1])
220+
key = key_parser(inner_splits[i])
221+
if key in out_dict:
222+
raise ValueError("Duplicate key found in dict: {}".format(key))
223+
out_dict[key] = val_parser(inner_splits[i + 1])
221224
return out_dict
222225

223226
return functools.partial(dict_parse)

fgpyo/util/tests/test_inspect.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
from fgpyo.util.inspect import attr_from
1111
from fgpyo.util.inspect import attribute_has_default
1212
from fgpyo.util.inspect import attribute_is_optional
13+
from fgpyo.util.inspect import dict_parser
1314
from fgpyo.util.inspect import list_parser
1415
from fgpyo.util.inspect import set_parser
1516
from fgpyo.util.inspect import tuple_parser
16-
from fgpyo.util.inspect import dict_parser
1717

1818

1919
@attr.s(auto_attribs=True, frozen=True)
@@ -86,6 +86,7 @@ def test_set_parser() -> None:
8686
parser = set_parser(Foo, Set[int], {})
8787
assert parser("{}") == set()
8888
assert parser("{1,2,3}") == {1, 2, 3}
89+
assert parser("{1,1,2,3}") == {1, 2, 3}
8990

9091

9192
def test_tuple_parser() -> None:
@@ -98,3 +99,9 @@ def test_dict_parser() -> None:
9899
parser = dict_parser(Foo, Dict[int, str], {})
99100
assert parser("{}") == {}
100101
assert parser("{123;a}") == {123: "a"}
102+
103+
104+
def test_dict_parser_with_duplicate_keys() -> None:
105+
parser = dict_parser(Foo, Dict[int, str], {})
106+
with pytest.raises(ValueError):
107+
parser("{123;a,123;b}")

0 commit comments

Comments
 (0)