# 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({
# Non-defaults following defaults.
with self.assertRaisesRegex(TypeError,
"non-default argument 'y' follows "
- "default argument"):
+ "default argument 'x'"):
@dataclass
class C:
x: int = 0
# 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
# 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
# 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: