From a5717e8c71f282dbe33a9dbd77a8f60ee1380f99 Mon Sep 17 00:00:00 2001 From: ramirezfranciscof Date: Tue, 17 Nov 2020 22:20:37 +0100 Subject: [PATCH] Fix wrong raise from dict nodes When accessing an attribute as a dict (`dictnode['key']`), the error raised was an AttributeError instead of a KeyError, which is rather unusual. This has been fixed and a test that checks the correct error raise has been added. Cherry-pick: 87d7a60fa3ba9077aefac954dca696385196923f --- aiida/orm/nodes/data/dict.py | 5 ++++- tests/orm/data/test_dict.py | 12 ++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/aiida/orm/nodes/data/dict.py b/aiida/orm/nodes/data/dict.py index 07e12de69e..a40374ac42 100644 --- a/aiida/orm/nodes/data/dict.py +++ b/aiida/orm/nodes/data/dict.py @@ -62,7 +62,10 @@ def __init__(self, **kwargs): self.set_dict(dictionary) def __getitem__(self, key): - return self.get_attribute(key) + try: + return self.get_attribute(key) + except AttributeError as exc: + raise KeyError from exc def __setitem__(self, key, value): self.set_attribute(key, value) diff --git a/tests/orm/data/test_dict.py b/tests/orm/data/test_dict.py index 87416dd3fb..5a25fab95d 100644 --- a/tests/orm/data/test_dict.py +++ b/tests/orm/data/test_dict.py @@ -50,3 +50,15 @@ def test_set_item(self): self.assertEqual(self.node['value'], 2) self.node.dict.value = 3 self.assertEqual(self.node['value'], 3) + + def test_correct_raises(self): + """Test that the methods for accessing the item raise the correct error. + + * `dictnode['inexistent']` should raise KeyError + * `dictnode.dict.inexistent` should raise AttributeError + """ + with self.assertRaises(KeyError): + _ = self.node['inexistent_key'] + + with self.assertRaises(AttributeError): + _ = self.node.dict.inexistent_key