* Attributes now can have user-defined metadata which greatly improves attrs‘s extensibility.
* Allow for a __attrs_post_init__ method that – if defined – will get called at the end of the attrs-generated __init__ method.
* Add @attr.s(str=True) that will optionally create a __str__ method that is identical to __repr__. This is mainly useful with Exceptions and other classes that rely on a useful __str__ implementation but overwrite the default one through a poor own one. Default Python class behavior is to use __repr__ as __str__ anyways.
If you tried using attrs with Exceptions and were puzzled by the tracebacks: this option is for you.
* Don’t overwrite __name__ with __qualname__ for attr.s(slots=True) classes.