diff --git a/CHANGELOG.md b/CHANGELOG.md index f74d876b530dc304b8f2a2ba951eaea13b057f2c..c8e20a2f7ee4d717404255625b31685fc681d945 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ -# v2.25.10 +# v2.26.0 -* _TBA_ +* **breaking change**: DictObject will no longer announce it's presence via __str__ and __repr__. It will just display + it's dictionary. +* nested creation of DictObject's was optimized # v2.25.9 diff --git a/satella/__init__.py b/satella/__init__.py index f5c827dd1f560204193e14311c397ac7e3b8efdb..4e71e9adf0111fc0bcba9504862e4f48c9220f0e 100644 --- a/satella/__init__.py +++ b/satella/__init__.py @@ -1 +1 @@ -__version__ = '2.25.10a1' +__version__ = '2.26.0' diff --git a/satella/coding/structures/dictionaries/dict_object.py b/satella/coding/structures/dictionaries/dict_object.py index 97578f7419d3f209404f9218de680dd9590e9693..38ef36636f961ee739530d16fa1b9686ed482f75 100644 --- a/satella/coding/structures/dictionaries/dict_object.py +++ b/satella/coding/structures/dictionaries/dict_object.py @@ -22,18 +22,19 @@ class DictObject(dict): >>> self.assertEqual(a['test'], 5) """ + def __new__(cls, *args, **kwargs): + if not kwargs and len(args) == 1: + arg, = args + if isinstance(arg, DictObject): + return arg + return super().__new__(cls, *args, **kwargs) + def __copy__(self): return DictObject(copy.copy(super())) def __deepcopy__(self, memo=None): return DictObject(copy.deepcopy(super(), memo=memo)) - def __str__(self) -> str: - return 'DictObject(%s)' % (super().__str__(),) - - def __repr__(self) -> str: - return 'DictObject(%s)' % (super().__repr__(),) - @rethrow_as(KeyError, AttributeError) def __getattr__(self, item): return self[item] diff --git a/tests/test_coding/test_structures.py b/tests/test_coding/test_structures.py index bb01d1b3db6c4b74ece687bb5756eff63c057e51..4ab4517058fc25e3e019905dc5dd223042998674 100644 --- a/tests/test_coding/test_structures.py +++ b/tests/test_coding/test_structures.py @@ -503,6 +503,11 @@ class TestStructures(unittest.TestCase): self.assertEqual(cd[2], []) self.assertEqual(cd[2], []) + def test_new_dictobject(self): + a = DictObject(a=5, k=3) + b = DictObject(a) + self.assertIs(a, b) + def test_dictobject_dictobject(self): a = DictObject(a=5, k=3) b = DictObject(a) @@ -514,8 +519,6 @@ class TestStructures(unittest.TestCase): self.assertEqual(b.c, 4) self.assertEqual(b['c'], 4) - self.assertIn('DictObject', str(b)) - self.assertIn('DictObject', repr(b)) self.assertIn('a', b.keys()) self.assertIn(5, b.values()) self.assertIn(('a', 5), b.items())