You are not the first to have this idea. Unless I am mistaken you might find what you are looking for in dataclasses which were added in Python 3.7:
https://docs.python.org/3/library/dataclasses.html On Mon, 4 May 2020 at 19:06, Lewis Ball <lrjb...@gmail.com> wrote: > Hi All, > > First of all, if this is something which has been discussed in the past > the please point me in the right direction. > > *Problem:* > > When creating classes in Python, I find myself writing the __init__ method > in a very similar way a lot of the time, that is: > ``` > def __init__(self, argument_1, argument_2, argument_3=None): > self.argument_1 = argument_1 > self.argument_2 = argument_2 > self.argument_3 = argument_3 > # then maybe some other attribute setting and logic follows > ``` > > Every argument of __init__ gets a corresponding attribute with the same > name. This means that each `argument_i` has been typed 3 times, which seems > overly-verbose as well as being easy to mistype. This pattern is easy to > find in various popular python libraries, and in some it is actually > enforced. For example, I do quite a bit of work with classifiers using the > sklearn estimator API, and for various reasons sklearn enforce this pattern > for an __init__ (see here > <https://scikit-learn.org/stable/developers/develop.html#instantiation> > if interested). > > Here is an example of this pattern from the standard library (from > textwrap.TextWrapper): > ``` > def __init__(self, > width=70, > initial_indent="", > subsequent_indent="", > expand_tabs=True, > replace_whitespace=True, > fix_sentence_endings=False, > break_long_words=True, > drop_whitespace=True, > break_on_hyphens=True, > tabsize=8, > *, > max_lines=None, > placeholder=' [...]'): > self.width = width > self.initial_indent = initial_indent > self.subsequent_indent = subsequent_indent > self.expand_tabs = expand_tabs > self.replace_whitespace = replace_whitespace > self.fix_sentence_endings = fix_sentence_endings > self.break_long_words = break_long_words > self.drop_whitespace = drop_whitespace > self.break_on_hyphens = break_on_hyphens > self.tabsize = tabsize > self.max_lines = max_lines > self.placeholder = placeholder > ``` > > With a quick scan of the top 50 or so most used python packages, *1 in 4* > __init__ methods that takes arguments has the line `self.argument_i = > argument_i` for every single argument, with several of them having 10+ > arguments. > > *Suggestion:* > > A new built-in called something like `assign()` which would assign every > single __init__ arg to a corresponding attribute. e.g. the snippet from > above could be rewritten to: > ``` > def __init__(self, argument_1, argument_2, argument_3=None): > assign() > # other init logic goes here > ``` > > This could alternatively be implemented as a decorator, like so > ``` > @assign > def __init__(self, argument_1, argument_2, argument_3=None): > # other init logic goes here > ``` > but then this requires a `pass` if no other logic is needed inside the > __init__. There may also be some other syntax for this which would be even > easier to use. > > Is this something that others would find useful? > > Thanks, > > Lewis > _______________________________________________ > Python-ideas mailing list -- python-ideas@python.org > To unsubscribe send an email to python-ideas-le...@python.org > https://mail.python.org/mailman3/lists/python-ideas.python.org/ > Message archived at > https://mail.python.org/archives/list/python-ideas@python.org/message/VLI3DOFA5VWMGJMJGRDC7JZTRKEPPZNU/ > Code of Conduct: http://python.org/psf/codeofconduct/ >
_______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/6O7NA2QVZ7IHDS3PWAZZF56OVGFTRBRN/ Code of Conduct: http://python.org/psf/codeofconduct/