<div dir="ltr"><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div>tldr: Using three method declarations or chaining method calls is ugly, why not allow variables and attributes to be decorated too?<br><br></div>Currently the way to create variables with custom get/set/deleters is to use the @property decorator or use property(get, set, del, doc?), and this must be repeated per variable. If I were able to decorate multiple properties with decorators like @not_none or something similar, it would take away a lot of currently used confusing code.<br><br></div>Feedback is appreciated.<br><br>-----------<br><br></div>The current ways to define the getter, setter and deleter methods for a variable or attribute are the following:<br><br>    @property<br></div>    def name():<br></div>        """ docstring """<br></div>       ... code<br></div><br>    @name.setter<br></div>    def name():<br></div>        ... code<br><br></div>    @name.deleter<br></div>    def name():<br></div>        ... code<br><br></div>and<br><br></div>    var = property(getter, setter, deleter, docstring)<br><br><br></div>These two methods are doable when you only need to change access behaviour changes on only one variable or property, but the more variables you want to change access to, the longer and more bloated the code will get. Adding multiple restrictions on a variable will for instance look like this:<br><br></div><div>    var = decorator_a(decorator_b(property(value)))<br><br></div><div>or<br></div><div><br>    @property<br>    def var(self):<br></div><div>        return decorator_a.getter(decorator_b..getter(self._value))<br></div><div>        ... etc<br><br></div><div>or even this<br><br></div><div>    @decorator_a<br></div><div>    @decorator_b<br></div><div>    def var(self):<br></div><div>        pass<br><br><br></div><div>I propose the following syntax, essentially equal to the syntax of function decorators:<br><br></div><div>    @decorator<br></div><div>    var = some_value<br><br></div><div>which would be the same as<br></div><div><br>    var = decorator(some_value)<br><br></div><div>and can be chained as well:<br><br></div><div>    @decorator<br></div><div>    @decorator_2<br></div><div>    var = some_value<br><br></div><div>which would be<br><br></div><div>   var = decorator(decorator_2(some_value))<br><br></div><div>or similarly<br><br></div><div>    var = decorator(decorator_2())<br></div><div>    var = some_value<br><br></div><div>The main idea behind the proposal is that you can use the decorator as a standardized way to create variables that have the same behaviour, instead of havng to do that using methods. I think that a lot can be gained by specifying a decorator that can 
decorate variables or properties. <br><br>Note that many arguments will be the same as for 
function decorators (PEP 0318), but then applied to variable/property/attribute
 declaration. </div></div>