-
-
Couldn't load subscription status.
- Fork 406
Description
I was getting the
No mandatory attributes allowed after an attribute with a default value or factory. error message related to issues #38 and #93. I had been stumped as to what the order of attributes was for my class and which ones had and which lacked defaults/factory methods. It would be super useful if the exception printed more about the offending attributes. In my case, I wanted to know:
"What is the first attribute that has a default that appears ahead of an attribute which lacks one?"
right now, the error message only tells me what attribute lacks a default.
E.g., I edited _make.py around line 331 (as of version 17.4) to this:
had_default = False which_had_default = None for a in attrs: if had_default is True and a.default is NOTHING and a.init is True: raise ValueError( "No mandatory attributes allowed after an attribute with a " "default value or factory. Attribute in question: {a!r} appears after {before!r}" .format(a=a, before=which_had_default) ) elif had_default is False and \ a.default is not NOTHING and \ a.init is not False: had_default = True which_had_default = a (Printing only this message was not quite sufficient for my pretty funky case, and so I ended up printing out the full ordered list of attributes to see which were appearing out of reverse-MRO order and causing my problem. It might be even more helpful to print out the full attrs list in the even of an error.)