Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Validation errors from multiple fields are not in ClassValidationError

Aperta
#694 7 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
45/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
python
Ambito
backend

Direzione di ricerca

Start by running the provided Python reproducer against cattrs.structure and then inspect cattrs.transform_exception with the resulting ClassValidationError. Trace how validation failures from fields a and b are collected and transformed; done means both field errors appear in ClassValidationError and the transformed output identifies their locations.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

validation

python version: 3.13.7
attrs version: 25.4.0
cattrs version 25.3.0

When I try to structure a dict into a class, I only see a validation error from one field, when I would expect to see multiple.

Example:

import attrs
import cattrs

@attrs.define()
class Foo:
    a: str = attrs.field(validator=[attrs.validators.min_len(3)])
    b: str = attrs.field(validator=[attrs.validators.min_len(3)])

cattrs.structure(
    {"a": "a", "b": "b"},
    Foo,
)

I am expecting to see validation errors from fields a and b, but only see a:

Traceback (most recent call last):
  File "<cattrs generated structure __main__.Foo>", line 16, in structure_Foo
    return __cl(
      **res,
    )
  File "<attrs generated methods __main__.Foo>", line 28, in __init__
    __attr_validator_a(self, __attr_a, self.a)
    ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.13/site-packages/attr/_make.py", line 3279, in __call__
    v(inst, attr, value)
    ~^^^^^^^^^^^^^^^^^^^
  File ".venv/lib/python3.13/site-packages/attr/validators.py", line 575, in __call__
    raise ValueError(msg)
ValueError: Length of 'a' must be >= 3: 1

During handling of the above exception, another exception occurred:

  + Exception Group Traceback (most recent call last):
  |   File "/home/lincoln/.config/JetBrains/PyCharm2025.2/scratches/scratch_2.py", line 12, in <module>
  |     cattrs.structure(
  |     ~~~~~~~~~~~~~~~~^
  |         {"a": "a", "b": "b"},
  |         ^^^^^^^^^^^^^^^^^^^^^
  |         Foo,
  |         ^^^^
  |     )
  |     ^
  |   File ".venv/lib/python3.13/site-packages/cattrs/converters.py", line 589, in structure
  |     return self._structure_func.dispatch(cl)(obj, cl)
  |            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
  |   File "<cattrs generated structure __main__.Foo>", line 19, in structure_Foo
  |     except Exception as exc: raise __c_cve('While structuring ' + 'Foo', [exc], __cl)
  |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  | cattrs.errors.ClassValidationError: While structuring Foo (1 sub-exception)
  +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    |   File "<cattrs generated structure __main__.Foo>", line 16, in structure_Foo
    |     return __cl(
    |       **res,
    |     )
    |   File "<attrs generated methods __main__.Foo>", line 28, in __init__
    |     __attr_validator_a(self, __attr_a, self.a)
    |     ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
    |   File ".venv/lib/python3.13/site-packages/attr/_make.py", line 3279, in __call__
    |     v(inst, attr, value)
    |     ~^^^^^^^^^^^^^^^^^^^
    |   File ".venv/lib/python3.13/site-packages/attr/validators.py", line 575, in __call__
    |     raise ValueError(msg)
    | ValueError: Length of 'a' must be >= 3: 1
    +------------------------------------

Plus when I pass that exception to cattrs.transform_exception the output list is

['invalid value @ $']

which seems lacking on detail of where the validation error happened.

I am expecting to see multiple because the docs say

When structuring a class, cattrs will gather any exceptions on a field-by-field basis and raise them as a cattrs.ClassValidationError, which is a subclass of BaseValidationError.

I am doing something wrong, or this not a feature of cattrs?

Lingua principale
Python
Stelle
1.1k
Fork
159
Merge medio
12h 21m
PR unite (30g)
6

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di python-attrs/cattrs

Tutte le issue di python-attrs/cattrs

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.