This might be a bit of an extreme step to take, but has new syntax for this
ever been discussed? Here I am using the same indicator for keyword
arguments as in a function signature, hanging on a line by itself:

@dataclasses.dataclass
class Comparator:
    a: Any
    b: Any
    *
    key: Optional[Callable[whatever]] = None
Could also support the positional only version:

@dataclasses.dataclass
class Comparator:
    /  # args become positional after this line
    a: Any
    b: Any
    *  # args become kwd args after this line
    key: Optional[Callable[whatever]] = None

As far as how these standalone symbols would be parsed, I have no ideas on
that. Because of the way Dataclasses work, the / and * lines would have to
produce SOMETHING for the decorator to find. I'm just not sure what that
something would be.

But I think it looks pretty good if you're already familiar with python
function signature syntax.

Taking this to the logical conclusion:

@dataclasses.dataclass
class Comparator:
    /
    a: Any
    b: Any
    *others: Any  # collect more positional args
    key: Optional[Callable[whatever]] = None
    **kwargs: Any  # collect more kwd args


On Thu, Mar 11, 2021, 12:51 AM Eric V. Smith <e...@trueblade.com> 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:
>
> I've seen comments from Eric V Smith in this thread and in the PR. If he's
> in favor and it can be done in a backwards compatible way then he can guide
> you to acceptance and merging of your PR. But like all of us he has limited
> time.
>
> On Wed, Mar 10, 2021 at 6:15 AM Laurie O <laurie_opper...@hotmail.com>
> wrote:
>
>> I've had tens of people show interest in my proposal, asking what the
>> blocker is in acceptance. As far as I know, no Python developer has shown
>> any interest in it.
>>
>> My proposal is to automatically make any non-default fields become
>> keyword-only `__init__` parameters, with no need to have any arguments
>> passed to the `dataclass` decorator.
>>
>> My PR: https://github.com/python/cpython/pull/17322
>>
>> My previous mailing-list message:
>> https://mail.python.org/archives/list/python-ideas@python.org/message/2V2SCUFMK7PK3DVA7D77AVXWIXNTSQDK/
>> _______________________________________________
>> 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/KPVB2G64BHFGGOTXZQXT3AU7SIO5ABJE/
>> Code of Conduct: http://python.org/psf/codeofconduct/
>>
>
>
> --
> --Guido van Rossum (python.org/~guido)
> *Pronouns: he/him **(why is my pronoun here?)*
> <http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/>
>
> _______________________________________________
> Python-ideas mailing list -- python-ideas@python.org
> To unsubscribe send an email to 
> python-ideas-leave@python.orghttps://mail.python.org/mailman3/lists/python-ideas.python.org/
> Message archived at 
> https://mail.python.org/archives/list/python-ideas@python.org/message/IN3D7UQQI4HSKSCUPMU3C3RTUG6NWUKG/
> 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/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/NELIW4C374INVAV6Z6TAIM5ZFLT5PN52/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to