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