diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2021-04-06 05:31:54 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-06 05:31:54 (GMT) |
commit | b132be8b43afa739b7eda271b82711d64a83da4f (patch) | |
tree | 170e079297320b5ccb5c8eee3c9af0087dfaf853 | |
parent | bdee2a389e4b10e1c0ab65bbd4fd03defe7b2837 (diff) | |
download | cpython-b132be8b43afa739b7eda271b82711d64a83da4f.zip cpython-b132be8b43afa739b7eda271b82711d64a83da4f.tar.gz cpython-b132be8b43afa739b7eda271b82711d64a83da4f.tar.bz2 |
bpo-43176: Fix processing of empty dataclasses (GH-24484)
When a dataclass inherits from an empty base, all immutability checks are omitted. This PR fixes this and adds tests for it.
Automerge-Triggered-By: GH:ericvsmith
(cherry picked from commit 376ffc6ac491da74920aed1b8e35bc371cb766ac)
Co-authored-by: Iurii Kemaev <6885137+hbq1@users.noreply.github.com>
-rw-r--r-- | Lib/dataclasses.py | 2 | ||||
-rwxr-xr-x | Lib/test/test_dataclasses.py | 24 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2021-02-09-07-24-29.bpo-43176.bocNQn.rst | 1 |
3 files changed, 26 insertions, 1 deletions
diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index c38e16a..5825e8e 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -834,7 +834,7 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen): # Only process classes that have been processed by our # decorator. That is, they have a _FIELDS attribute. base_fields = getattr(b, _FIELDS, None) - if base_fields: + if base_fields is not None: has_dataclass_bases = True for f in base_fields.values(): fields[f.name] = f diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index bbcf30c..548f10b 100755 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -2568,6 +2568,30 @@ class TestFrozen(unittest.TestCase): self.assertEqual(d.i, 0) self.assertEqual(d.j, 10) + def test_inherit_nonfrozen_from_empty_frozen(self): + @dataclass(frozen=True) + class C: + pass + + with self.assertRaisesRegex(TypeError, + 'cannot inherit non-frozen dataclass from a frozen one'): + @dataclass + class D(C): + j: int + + def test_inherit_nonfrozen_from_empty(self): + @dataclass + class C: + pass + + @dataclass + class D(C): + j: int + + d = D(3) + self.assertEqual(d.j, 3) + self.assertIsInstance(d, C) + # Test both ways: with an intermediate normal (non-dataclass) # class and without an intermediate class. def test_inherit_nonfrozen_from_frozen(self): diff --git a/Misc/NEWS.d/next/Library/2021-02-09-07-24-29.bpo-43176.bocNQn.rst b/Misc/NEWS.d/next/Library/2021-02-09-07-24-29.bpo-43176.bocNQn.rst new file mode 100644 index 0000000..66a175d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-02-09-07-24-29.bpo-43176.bocNQn.rst @@ -0,0 +1 @@ +Fixed processing of empty dataclasses.
\ No newline at end of file |