On Sat, Mar 13, 2021 at 3:14 PM Eric V. Smith <e...@trueblade.com> wrote:

> On 3/13/2021 2:51 PM, Abdulla Al Kathiri wrote:
>
> I don’t like the idea of going back and fourth for positional and keyword
> arguments. The positional arguments have to stay at the top of some
> variable (be it anything, e.g, __pos: Any). The mixed stays in between the
> two markers. And the keyword arguments come after yet another predefined
> variable with leading dunder (e.g., __kw:Any). Please if you are going to
> do this for dataclasses, it has to match the function signature. This will
> be much easier for us to use, read, and teach. Going back and forth will
> cause a lot of confusion, as the order of the arguments in the init method
> will not follow the same order as the arguments defined in the dataclass.
> Thanks to whoever mentioned this in this email chain.
>
> Thething is, even without being able to switch back and forth within a
> single dataclass, you could achieve the same thing with inheritance:... In
> both cases, you'd get re-ordered fields in __init__, and nowhere else:
>
> def __init__(c, d, *, a, b, e, f):
>
> repr, comparisons, etc. would still treat them in today's order: a, b, c,
> d, e, f.
>
> Other than putting in logic to call that an error, which I wouldn't want
> to do, it would be allowable. Why not allow the shortcut version if that's
> what people want to do? Again, I'm not saying this needs to be a day one
> feature using "__kw_only__: ArgumentMarker" (or however it's ultimately
> spelled). I just don't want to rule it out in case we come up with some
> reason it's important.
>
> I just checked and attrs allows that last case:
>
> @attr.s
> class A:
>     a = attr.ib(kw_only=True)
>     b = attr.ib(kw_only=True)
>     c = attr.ib()
>     d = attr.ib()
>     e = attr.ib(kw_only=True)
>     f = attr.ib(kw_only=True)
>
> Which generates help like:
>
> class A(builtins.object)
>  |  A(c, d, *, a, b, e, f) -> None
>
> The main reason to allow the switching back and forth is to support
> subclassing dataclasses that already have normal and keyword-only fields.
> If you didn't allow this, you'd have to say that the MostDerived class
> above would be an error because the __init__ looks like the parameters have
> been rearranged.
>
> And the same logic would apply to positional argument fields.
>
> I just don't see the need to prohibit it in general. Any tutorial would
> probably show the fields in the order you describe above: positional,
> normal, keyword-only.
>
> Eric
>
>
> Abdulla
>
> Sent from my iPhone
>
> On 13 Mar 2021, at 9:30 PM, Paul Bryan <pbr...@anode.ca> <pbr...@anode.ca>
> wrote:
>
> 
> +1 to Matt's points here. I get the desire for symmetry with / and * in
> params, but I'm not convinced it's useful enough to warrant the complexity
> of the approaches being proposes. I think a @dataclass(..., kwonly=True)
> would solve > 90% of the issues with dataclass usability today.
>
> On Sat, 2021-03-13 at 06:41 -0500, Matt Wozniski wrote:
>
> On Fri, Mar 12, 2021, 11:55 PM Eric V. Smith <e...@trueblade.com> wrote:
>
> There have been many requests to add keyword-only fields to dataclasses.
> These fields would result in __init__ parameters that are keyword-only.
> As long as I'm doing this, I'd like to add positional-only fields as well.
>
>
> Have there also been requests for positional-only fields?
>
> The more I digest this idea, the more supporting positional-only fields
> sounds like a bad idea to me. The motivation for adding positional-only
> arguments to the language was a) that some built-in functions take only
> positional arguments, and there was no consistent way to document that and
> no way to match their interface with pure Python functions, b) that some
> parameters have no semantic meaning and making their names part of the
> public API forces library authors to maintain backwards compatibility on
> totally arbitrary names, and c) that functions like `dict.update` that take
> arbitrary keyword arguments must have positional-only parameters in order
> to not artificially reduce the set of keyword arguments that may be passed
> (e.g., `some_dict.update(self=5)`).
>
> None of these cases seem to apply to dataclasses. There are no existing
> dataclasses that take positional-only arguments that we need consistency
> with. Dataclasses' constructors don't take arbitrary keyword arguments in
> excess of their declared fields. And most crucially, the field names become
> part of the public API of the class. Dataclass fields can never be renamed
> without a risk of breaking existing users. Taking your example from the
> other thread:
>
> ```
> @dataclasses.dataclass
> class Comparator:
>     a: Any
>     b: Any
>     _: dataclasses.KEYWORD_ONLY
>     key: Optional[Callable[whatever]] = None
> ```
>
> The names `a` and `b` seem arbitrary, but they're not used only in the
> constructor, they're also available as attributes of the instances of
> Comparator, and dictionary keys in the `asdict()` return. Even if they were
> positional-only arguments to the constructor, that would forbid calling
>
> comp = Comparator(a=1, b=2, key=operator.lt)
>
> but it would still be possible to call
>
> comp = Comparator(1, 2, key=operator.lt)
> print(comp.a, comp.b)
>
> Preventing them from being passed by name to the constructor seems to be
> adding an inconsistency, not removing one.
>
> Perhaps it makes sense to be able to make init-only variables be
> positional-only, since they don't become part of the class's public API,
> but in that case it seems it could just be a flag passed to `InitVar`.
> Outside of init-only variables, positional-only arguments seem like a
> misfeature to me.
>
> ~Matt
> _______________________________________________
> 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/LPUHXVDHW7QQR4KNOQQTNWT6UJ2CHDBI/
> 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/DWMTQCOHZG233R5POM74RUTOYP3AV6FH/
> Code of Conduct: http://python.org/psf/codeofconduct/
>
> --
> Eric V. Smith
>
>
_______________________________________________
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/6ZFAN3D552UVPADFQACQNYPJXLCOELZ2/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to