summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudiu Popa <pcmanticore@gmail.com>2015-10-06 01:59:20 +0300
committerClaudiu Popa <pcmanticore@gmail.com>2015-10-06 01:59:20 +0300
commite68a84ba341402b7692b86b84486e807325149ca (patch)
treeaa5726580fea37d004077828ac599f2cda8e85b1
parent252d7c510a40f1ad01d77bba36ad796fb5f0bb12 (diff)
downloadastroid-e68a84ba341402b7692b86b84486e807325149ca.tar.gz
Add support for looking up into DictUnpack's value in Dict.getitem
-rw-r--r--astroid/node_classes.py6
-rw-r--r--astroid/tests/unittest_python3.py9
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()