diff options
author | Claudiu Popa <pcmanticore@gmail.com> | 2015-10-06 01:59:20 +0300 |
---|---|---|
committer | Claudiu Popa <pcmanticore@gmail.com> | 2015-10-06 01:59:20 +0300 |
commit | e68a84ba341402b7692b86b84486e807325149ca (patch) | |
tree | aa5726580fea37d004077828ac599f2cda8e85b1 | |
parent | 252d7c510a40f1ad01d77bba36ad796fb5f0bb12 (diff) | |
download | astroid-e68a84ba341402b7692b86b84486e807325149ca.tar.gz |
Add support for looking up into DictUnpack's value in Dict.getitem
-rw-r--r-- | astroid/node_classes.py | 6 | ||||
-rw-r--r-- | astroid/tests/unittest_python3.py | 9 |
2 files changed, 15 insertions, 0 deletions
diff --git a/astroid/node_classes.py b/astroid/node_classes.py index 744d88f..ebe4fd8 100644 --- a/astroid/node_classes.py +++ b/astroid/node_classes.py @@ -810,6 +810,12 @@ class Dict(bases.NodeNG, bases.Instance): def getitem(self, lookup_key, context=None): for key, value in self.items: + # TODO(cpopa): no support for overriding yet, {1:2, **{1: 3}}. + if isinstance(key, DictUnpack): + try: + return value.getitem(lookup_key, context) + except IndexError: + continue for inferredkey in key.infer(context): if inferredkey is util.YES: continue diff --git a/astroid/tests/unittest_python3.py b/astroid/tests/unittest_python3.py index f98d220..6e08776 100644 --- a/astroid/tests/unittest_python3.py +++ b/astroid/tests/unittest_python3.py @@ -241,6 +241,15 @@ class Python3TC(unittest.TestCase): node = extract_node(code) self.assertEqual(node.as_string(), code) + @require_version('3.5') + def test_unpacking_in_dict_getitem(self): + node = extract_node('{1:2, **{2:3, 3:4}, **{5: 6}}') + for key, expected in ((1, 2), (2, 3), (3, 4), (5, 6)): + value = node.getitem(key) + self.assertIsInstance(value, nodes.Const) + self.assertEqual(value.value, expected) + + if __name__ == '__main__': unittest.main() |