On Wed, Apr 20, 2022 at 12:30 PM Pablo Alcain <pabloalc...@gmail.com> wrote:

>
> Regarding the usage of a decorator to do the auto-assignment, I think that
> it has an issue regarding how to select a subset of the variables that you
> would be setting. In the general case, you can probably get away with
> calling `autoassign`. But, for example, if you want to set a but not b,
> you'd probably have to use a string as the identifier of the parameters
> that you want to assign:
>
> ```
> class MyKlass:
>     @autoassign('a')
>     def __init__(self, a, b):
>         print(b)
>
> ```
>
> This, in my perspective, brings two things: the first one is that you'd be
> repeating everywhere the list of names, so for example doing refactors like
> changing a variable name would be a bit error-prone: If you change the
> variable from `a` to `my_var_name`, you'd have to also change the list in
> the autoassign. It's not a lot, but it can induce some errors because of
> the repetition. On the other hand, I guess it would be a bit hard for IDEs
> and static checkers to follow this execution path. I know that I'm only one
> data point, but for what it's worth, I was very excited with the idea but
> this prevented me from actually implementing this solution on a day-to-day
> basis: it felt a bit fragile and induced me to some errors.
>

IMO, that is trivially resolvable by doing the decorator, by default,
assign all parameters. If it tkaes a string or sequence with parameter
names, then, it will just bind those (still shorter than one line
`self.attr = attr` for each attribute.

And for the fragility: that is the advantage of having a robust
implementation of something like this on the stdlib: it is not something
most people will go out of their way to write their own, since the tradeoff
is just
copy and paste a bunch of plain assignments.

But having it right and known, could chop off tens of lines of useless code
in, probably the majority of Python projects.


Also answering Christopher Barker:

This has a subtle, but different use than dataclasses.
It might be grouped in the dataclasses module, on the stdlib.



>
> About dataclasses, the point that Chris mentions, I think that they are in
> a different scope from this, since they do much more stuff. But, beyond
> this, a solution on the dataclass style would face a similar scenario:
> since the `__init__` is autogenerated, you would also be in a tight spot in
> the situation of "how would I bind only one of the items?". Again, now I'm
> talking about my experience, but I think that it's very hard to think that
> we could replace "classes" with "dataclasses" altogether. Here's an example
> of one of the (unexpected for me) things that happen when you try to do
> inheritance on dataclasses: https://peps.python.org/pep-0557/#inheritance.
>
> Overall, I think that it's hard to think about a solution to this problem
> that is clean and robust without adding new syntax with it. I would like to
> hear your thoughts on this (and everyone else's of course!)
>
> Cheers,
> Pablo
>
> On Mon, Apr 18, 2022 at 9:55 PM Christopher Barker <python...@gmail.com>
> wrote:
>
>> On Mon, Apr 18, 2022 at 4:24 PM Joao S. O. Bueno <jsbu...@python.org.br>
>> wrote:
>>
>>> I for one am all for the inclusion of a decorator targeting either the
>>> __init__ method
>>> or the class itself to perform this binding of known arguments to
>>> instance attributes
>>> prior to entering __init__. It could live either in functools or
>>> dataclasses itself.
>>>
>>
>> Isn’t this what dataclasses already accomplish? I understand that it’s
>> the reverse— with a dataclass, you specify the fields, and the __init__ is
>> generated, whereas this proposal is ttt be at you’d write an __init__, and
>> the attributes would be set — but other than taste, is there a practical
>> difference?
>>
>> -CHB
>>
>>
>>> On Sat, Apr 16, 2022 at 5:49 PM Pablo Alcain <pabloalc...@gmail.com>
>>> wrote:
>>>
>>>> The problem of assigning init arguments as attributes has appeared
>>>> several times in the past (
>>>> https://mail.python.org/archives/list/python-ideas@python.org/message/VLI3DOFA5VWMGJMJGRDC7JZTRKEPPZNU/
>>>> was the most recent we could find) and is already handled in dataclasses.
>>>>
>>>> Lately, discussing this topic with a friend, we thought that using a
>>>> specific token could be a possible approach, so you could do:
>>>>
>>>> class MyClass:
>>>>
>>>>     def __init__(self, @a, @b, c):
>>>>
>>>>         pass
>>>>
>>>> and it would be analogous to doing:
>>>>
>>>> class MyClass:
>>>>
>>>>     def __init__(self, a, b, c):
>>>>
>>>>         self.a = a
>>>>
>>>>         self.b = b
>>>>
>>>> Then, you would instantiate the class as usual, and the variables
>>>> tagged with `@` would be bound to the object:
>>>>
>>>> >>> objekt = MyClass(2, 3, 4)
>>>>
>>>> >>> print(objekt.b)
>>>>
>>>> 3
>>>>
>>>> >>> print(objekt.c)
>>>>
>>>> AttributeError: 'MyClass' object has no attribute 'c'
>>>>
>>>>
>>>> We have a working implementation here if anyone wants to take a look
>>>> at: https://github.com/pabloalcain/cpython/tree/feature/auto_attribute.
>>>> Keep in mind that we have limited knowledge about how to modify cpython
>>>> itself, and which would the best places be to do the modifications, so it's
>>>> more than likely that some design decisions aren't very sound (
>>>> https://devguide.python.org/grammar/ and
>>>> https://devguide.python.org/parser/ were incredibly helpful).
>>>>
>>>> Besides the implementation, we would like to know what the community
>>>> thinks on whether this might have any value. While developing this, we
>>>> realized that Crystal already has this feature (eg
>>>> https://github.com/askn/crystal-by-example/blob/master/struct/struct.cr)
>>>> with the same syntax; which is kind of expected, considering it's syntax is
>>>> based on Ruby.
>>>>
>>>>
>>>> Random collection of thoughts:
>>>>
>>>> 1. If auto-assignment made sense in general, one of the reasons we went
>>>> for this rather than the decorator approach is that we wouldn't like to
>>>> have a list of strings that can vary decoupled from the actual argument
>>>> name.
>>>>
>>>> 2. The current implementation of `@` works for any function, not only
>>>> init. We don't know if this would actually be a desirable feature.
>>>>
>>>> 3. It also works with any function in the wild. This mostly allows for
>>>> monkey-patching to work out of the box:
>>>>
>>>> >>> class Klass:
>>>>
>>>> ...     def __init__(self):
>>>>
>>>> ...         pass
>>>>
>>>> ...
>>>>
>>>> >>> def add_parameter(k, @p):
>>>>
>>>> ...     pass
>>>>
>>>> ...
>>>>
>>>> >>> Klass.add_parameter = add_parameter
>>>>
>>>> >>> objekt = Klass()
>>>>
>>>> >>> print(objekt.p)
>>>>
>>>> Traceback (most recent call last):
>>>>
>>>>   File "<stdin>", line 1, in <module>
>>>>
>>>> AttributeError: 'Klass' object has no attribute 'p'
>>>>
>>>> >>> objekt.add_parameter(11)
>>>>
>>>> >>> print(objekt.p)
>>>>
>>>> 11
>>>>
>>>> Again, we are not sure if this is desirable, but it's what made most
>>>> sense for us at the moment.
>>>>
>>>> 4. Adding the `@` token to the argument doesn’t remove the variable
>>>> from the function/method scope, so this would be perfectly valid:
>>>>
>>>> >>> def my_function(k, @parameter):
>>>>
>>>> ...     print(parameter)
>>>>
>>>> >>> my_function(objekt, 4)
>>>>
>>>> 4
>>>>
>>>> >>> k.parameter
>>>>
>>>> 4
>>>>
>>>>
>>>>
>>>> 5. We didn’t implement it for lambda functions.
>>>>
>>>> Cheers,
>>>>
>>>> Pablo and Quimey
>>>>
>>>> _______________________________________________
>>>> 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/SCXHEWCHBJN3A7DPGGPPFLSTMBLLAOTX/
>>>> 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/HUGRGXVT7NBWSXI2ILZOMFIRWV4KIQ5Q/
>>> Code of Conduct: http://python.org/psf/codeofconduct/
>>>
>> --
>> Christopher Barker, PhD (Chris)
>>
>> Python Language Consulting
>>   - Teaching
>>   - Scientific Software Development
>>   - Desktop GUI and Web Development
>>   - wxPython, numpy, scipy, Cython
>>
>
_______________________________________________
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/ZEUFH6343EIN3REU4LFT7MMQJLSZLSL2/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to