From b1cee27393ce84bf914980a4a7b3465903ad5be0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20K=C3=A1cha?= <ph@cesnet.cz> Date: Mon, 19 Feb 2024 13:39:20 +0100 Subject: [PATCH] Implement correct setdefault method (returning possibly coerced data instead of original) --- test_typedcols.py | 10 ++++++++++ typedcols.py | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/test_typedcols.py b/test_typedcols.py index 9e73062..0f09924 100755 --- a/test_typedcols.py +++ b/test_typedcols.py @@ -134,6 +134,16 @@ class TestTypedDict(unittest.TestCase): ("note", None) ]) + def testSetDefaultNonexistent(self): + res = self.person.setdefault("tel", "1234") + self.assertEqual(res, 1234) + self.assertEqual(self.person["tel"], 1234) + + def testSetDefaultExistent(self): + res = self.person.setdefault("age", "50") + self.assertEqual(res, 34) + self.assertEqual(self.person["age"], 34) + class IntList(TypedList): item_type = int diff --git a/typedcols.py b/typedcols.py index 5c3468d..328b27a 100644 --- a/typedcols.py +++ b/typedcols.py @@ -201,6 +201,15 @@ class TypedDict(MutableMapping): del self.data[key] self.initItemDefault(key) + def setdefault(self, key, default=None): + """ Return coerced value instead of original """ + try: + return self[key] + except KeyError: + self[key] = default + return self[key] + + # Following definitions are not strictly necessary as MutableMapping # already defines them, however we can override them by calling to # possibly more optimized underlying implementations. -- GitLab