Skip to content

Commit 605cb9b

Browse files
committed
fix: improve error messages in deep_iterable and deep_mapping validators
When inner validators fail, the error message now includes the index/key of the failing element instead of just the parent attribute name. Before: "Length of 'x' must be >= 1: 0" After: "Length of 'x[1]' must be >= 1: 0" This makes it clear which element in the iterable/mapping failed validation. Fixes #1245
1 parent 25b74d6 commit 605cb9b

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

src/attr/validators.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -343,8 +343,13 @@ def __call__(self, inst, attr, value):
343343
if self.iterable_validator is not None:
344344
self.iterable_validator(inst, attr, value)
345345

346-
for member in value:
347-
self.member_validator(inst, attr, member)
346+
for idx, member in enumerate(value):
347+
try:
348+
self.member_validator(inst, attr, member)
349+
except (ValueError, TypeError) as e:
350+
# Re-raise with context about which member failed
351+
msg = str(e).replace(f"'{attr.name}'", f"'{attr.name}[{idx}]'")
352+
raise type(e)(msg) from None
348353

349354
def __repr__(self):
350355
iterable_identifier = (
@@ -399,9 +404,17 @@ def __call__(self, inst, attr, value):
399404

400405
for key in value:
401406
if self.key_validator is not None:
402-
self.key_validator(inst, attr, key)
407+
try:
408+
self.key_validator(inst, attr, key)
409+
except (ValueError, TypeError) as e:
410+
msg = str(e).replace(f"'{attr.name}'", f"'{attr.name}[key:{key!r}]'")
411+
raise type(e)(msg) from None
403412
if self.value_validator is not None:
404-
self.value_validator(inst, attr, value[key])
413+
try:
414+
self.value_validator(inst, attr, value[key])
415+
except (ValueError, TypeError) as e:
416+
msg = str(e).replace(f"'{attr.name}'", f"'{attr.name}[{key!r}]'")
417+
raise type(e)(msg) from None
405418

406419
def __repr__(self):
407420
return f"<deep_mapping validator for objects mapping {self.key_validator!r} to {self.value_validator!r}>"

0 commit comments

Comments
 (0)