summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorEric V. Smith <ericvsmith@users.noreply.github.com>2023-08-10 14:39:13 (GMT)
committerGitHub <noreply@github.com>2023-08-10 14:39:13 (GMT)
commite4275f4df36a7cdd58cd4daa7d65b1947a2593d3 (patch)
treeb8dd0fb2998ded4b29a7abdd7ed99797c2558e80 /Lib
parent37d8b904f8b5b660f556597b21c0933b841d18de (diff)
downloadcpython-e4275f4df36a7cdd58cd4daa7d65b1947a2593d3.zip
cpython-e4275f4df36a7cdd58cd4daa7d65b1947a2593d3.tar.gz
cpython-e4275f4df36a7cdd58cd4daa7d65b1947a2593d3.tar.bz2
gh-107838: In dataclasses, improve error message when a non-default field follows a default field. (gh-107842)
Add the name of the previous default argument field in an error message.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/dataclasses.py6
-rw-r--r--Lib/test/test_dataclasses.py8
2 files changed, 7 insertions, 7 deletions
diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py
index 3c72c28..21f3fa5 100644
--- a/Lib/dataclasses.py
+++ b/Lib/dataclasses.py
@@ -575,15 +575,15 @@ def _init_fn(fields, std_fields, kw_only_fields, frozen, has_post_init,
# message, and future-proofs us in case we build up the function
# using ast.
- seen_default = False
+ seen_default = None
for f in std_fields:
# Only consider the non-kw-only fields in the __init__ call.
if f.init:
if not (f.default is MISSING and f.default_factory is MISSING):
- seen_default = True
+ seen_default = f
elif seen_default:
raise TypeError(f'non-default argument {f.name!r} '
- 'follows default argument')
+ f'follows default argument {seen_default.name!r}')
locals = {f'__dataclass_type_{f.name}__': f.type for f in fields}
locals.update({
diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py
index 6669f1c..bd8d824 100644
--- a/Lib/test/test_dataclasses.py
+++ b/Lib/test/test_dataclasses.py
@@ -134,7 +134,7 @@ class TestCase(unittest.TestCase):
# Non-defaults following defaults.
with self.assertRaisesRegex(TypeError,
"non-default argument 'y' follows "
- "default argument"):
+ "default argument 'x'"):
@dataclass
class C:
x: int = 0
@@ -143,7 +143,7 @@ class TestCase(unittest.TestCase):
# A derived class adds a non-default field after a default one.
with self.assertRaisesRegex(TypeError,
"non-default argument 'y' follows "
- "default argument"):
+ "default argument 'x'"):
@dataclass
class B:
x: int = 0
@@ -156,7 +156,7 @@ class TestCase(unittest.TestCase):
# a field which didn't use to have a default.
with self.assertRaisesRegex(TypeError,
"non-default argument 'y' follows "
- "default argument"):
+ "default argument 'x'"):
@dataclass
class B:
x: int
@@ -4521,7 +4521,7 @@ class TestKeywordArgs(unittest.TestCase):
# Make sure we still check for non-kwarg non-defaults not following
# defaults.
- err_regex = "non-default argument 'z' follows default argument"
+ err_regex = "non-default argument 'z' follows default argument 'a'"
with self.assertRaisesRegex(TypeError, err_regex):
@dataclass
class A: