
typing.NamedTuple was already mentioned in this discussion, I just would like to add few comments: 1. I think that changing Python syntax to support declarative classes is not a realistic option in nearby future. In contrast, there is an existing syntax change - variable annotations - that can be actively experimented with. Variable annotations are designed to play well with metaclass machinery, for example, they will respect __prepare__ method, if it injects __annotations__ as a custom mapping, etc. 2. Possible strategy for declarative classes could be developing independent *composable* mixins/traits: @comparable @pickleable class MyClass: x: int y: int or class MyClass(Comparable, Pickleable): x: int y: int The problem with the second approach is that it can lead to metaclass conflicts. A possible solution will be to provide a standard metaclass for mixins in stdlib. 3. Composability could be a problem if only normal variable assignments are used: after one mixin transforms the class, the original declarations are lost. Simple possible solution would be to agree that mixins should *not* modify __annotations__, only __dict__. Currently, PEP 484 and PEP 526 specify that preferable use of annotations is type declarations. However, I think this can be generalized to just declarations. For example, by providing a special typing construct that will allow additional info apart from type: def large(val): return val > 42 @comparable @pickleable class MyClass x: Spec(int, validator=large) y: Spec(List[int], default_factory=list) -- Ivan