The proposed examples look awesome, thanks!

On Sun, Nov 29, 2020 at 7:27 PM Guido van Rossum <gu...@python.org> wrote:

> That's a fair criticism -- Protocols are usable for this, but the syntax
> is hardly the most intuitive, and most people would never think of this
> approach.
>
> I guess the alternative would be to duplicate the full syntax allowed in
> the parameter list of a 'def' statement (with some tweaks perhaps), so the
> following would all be valid types:
>
> (x: float, method: int|None = None) -> str
> (*args: int, **kwds: int) -> int
> (a: int, b: int, /) -> int
>
> As for tweaks, maybe we can change things so that (int, int) -> int is
> equivalent to the latter (since this is presumably still a very common
> case). The rule would be something like "if there's no /, a / is assumed at
> the end", and also "in positional args, the syntax is [name ':'] type_expr
> ['=' default_expr]."
>
> Gotta go,
>
> On Sun, Nov 29, 2020 at 12:02 AM Andrew Svetlov <andrew.svet...@gmail.com>
> wrote:
>
>> On Sun, Nov 29, 2020 at 1:49 AM Guido van Rossum <gu...@python.org>
>> wrote:
>>
>>> On Sat, Nov 28, 2020 at 9:32 AM Andrew Svetlov <andrew.svet...@gmail.com>
>>> wrote:
>>>
>>>> I would see support of all argument kinds support in any proposal for a
>>>> new callable: positional only args, named args, keyword-only, *args and
>>>> **kwargs.
>>>> The exact notation in probably less important than missing
>>>> functionality.
>>>>
>>>
>>> Hm, but using Protocol you can already express every callable type. We
>>> could duplicate all of the complexity of 'def' parameter lists into the
>>> type notation, but it would be very complex. So this requirement is at
>>> least debatable (I'm not actually sure how I feel about it).
>>>
>>>
>>
>> Don't get me wrong please. I'm not the typing system developer (while use
>> typing every day in my code).
>> You can consider this email as end-user feedback.
>>
>> I have a lot of code that uses `Callable[]` annotation; it is a natural
>> way of annotating any callable, isn't it.
>> Sometimes `Callable` doesn't work. For example, I cannot annotate a
>> function that accepts a keyword-only argument.
>>
>> Sure, I can use Protocol but it doesn't feel natural and requires more
>> code lines, especially if the Protocol is used once or twice.
>> Also, Protocol adds `self` to methods which looks at least confusing when
>> I annotate plain callables which naturally don't belong to any class:
>>
>> class MyFunc(typing.Protocol):
>>     def __call__(self, /, arg: int) -> str: ...
>>
>> Moreover, I recall a pull request to only of my libraries that had
>> something similar to:
>>
>> class MyProto(typing.Protocol):
>>     def __call__(self_, /, self: Class, arg: int) -> str: ...
>>
>> The protocol actually had two 'self': one fake self for protocol itself
>> and another one if the *real* self.
>> The PR was refactored to use a more *natural* style but my first reaction
>> was eyeballs :)
>>
>> The last thing that is unclear for me is mixing protocols with ParamSpec
>> from PEP-612.
>>
>> Sure, I can live with all the mentioned limitations and learn all the
>> required tricks if we have a consensus that Callable should operate with
>> positional unnamed arguments only; but allowing to write such things in a
>> manner similar to that Python supports for function definitions already
>> makes life easier.
>>
>> --
>> Thanks,
>> Andrew Svetlov
>>
>
>
> --
> --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/>
>


-- 
Thanks,
Andrew Svetlov
_______________________________________________
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/RY4AA7UAIXZRW3E4SS2OSCV2LQ6IXBZ5/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to