In my experience, a dataclass with more than a few attributes makes
using positional arguments unwieldy and error-prone. 

I would think something like @dataclass(kwonly=bool) with default of
False would be reasonably clean to implement and understand.

While I appreciate supporting existing behavior for backward
compatibility, I'm not so clear on the value of supporting a hybrid of
positional and keyword __init__ arguments. Could you shed some light on
your reasoning for supporting it?


On Thu, 2021-03-11 at 00:47 -0500, Eric V. Smith wrote:
> As I've said before, I'm not opposed to the feature of keyword-only
> arguments. I think it would be a great addition.
> However, the proposal from Laurie O is only for changing fields
> without default values following fields with default values to be
> keyword-only. At least that's how I understand it.
> So, that means that:
> @dataclasses.dataclass
> class Point:
>     x: int = 0
>     y: int
>     z: int
>     t: int = 0
> Would generate a __init__ with this signature:
> def __init__(self, x=0, *, y, z, t=0):
> While it's an interesting application, I think that's just too
> limiting. Among other things, I can't define a dataclass where all
> fields are keyword-only, or a class where there's only a single field
> and it's keyword-only. I also have to have at least one keyword-only
> field (here, y) that has no default value. z and t can have defaults,
> but not y.
> What I'd like to see is some way of having keyword-only arguments,
> with or without defaults. And I'd also like to see if we could get
> support for positional-only arguments at the same time.
> I'm not sure of the best way to achieve this. Using flags to field()
> doesn't sound awesome, but could be made to work. Or maybe special
> field names or types? I'm not crazy about that, but using special
> types would let you do something like:
> @dataclasses.dataclass
> class Point:
>     x: int = 0
>     _: dataclasses.KEYWORD_ONLY
>     y: int
>     z: int
>     t: int = 0
> And the dataclasses machinery would ignore the "_" field except for
> making everything after it keyword-only. Here the name "_" isn't
> special: any field (of any name) that's of type
> dataclasses.KEYWORD_ONLY would be ignored except for the keyword-only
> changing behavior. In some ways, it's like dataclasses.ClassVar,
> where the type is treated specially and the field doesn't become a
> __init__ argument.
> There are also issues with inheritance that would need to be thought
> through. This idea could also be extended for positional-only.
> I'm open to other suggestions.
> Eric
> On 3/10/2021 10:22 AM, Guido van Rossum wrote:
> 
> > _______________________________________________
> > Python-ideas mailing list -- 
> > To unsubscribe send an email to 
> > 
> > Message archived at 
> > Code of Conduct: 
> -- 
> 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/XSAYT2MFOIBYHYINDHLPR7V2WHCWRYPE/
> 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/UGNLUWT4OQC2JMEXSNIJRRCC4KMBE6XJ/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to