Thanks also Kevin for this feedback!

Good point about being careful to distinguish type parameters vs type
arguments. If I understand correctly, you're making two points:

1. The wording of the 'Multiple Type Variable Tuples: Not Allowed' section
- you're saying that we're being a bit imprecise here in saying that we
disallow multiple TypeVarTuples in a type parameter list, given that in
e.g. `def f(x: *Ts1, y: *Ts2)`, both Ts1 and Ts2 are members of the
parameter list for the function f, but there it's unambiguous, so in fact
it *is* allowed.

2. Use of wrong terminology elsewhere in the PEP. Agreed.

I'll draft a PR tweaking the wording to fix both these points.


On Thu, 13 Jan 2022 at 11:28, Kevin Millikin <kmilli...@deepmind.com> wrote:

> The wording there probably should be improved.  I had a different
> interpretation when I read that, so that suggests it needs to be clarified.
>
> We should ensure to draw a clear distinction between type parameters and
> type arguments.  (Generic classes and functions are parameterized over type
> parameters and they have a type parameter list that is implicit in the
> syntax.  Generic classes can be explicitly instantiated by giving them type
> arguments, and an instantiation has a (explicit or implicit) type argument
> list.)
>
> So when I read:
>
> """
> As of this PEP, only a single type variable tuple may appear in a type
> parameter list:
>
> class Array(Generic[*Ts1, *Ts2]): ...  # Error\
> """
>
> I interpreted it to mean that the error is that the type _parameters_ of
> the generic class Array include *Ts1 and *Ts2 (not that they were used as
> type arguments to Generic).  Similarly, this should be an error:
>
> class Array(dict[*Ts1], Generator[*Ts2]): ...
>
> even though there is only a single type variable tuple appearing in a type
> _argument_ list.
>
> The reason for the restriction is that the tupling of Array's type
> arguments is not explicit in an instantiation of Array, so we rely on this
> restriction so that they can be unambiguously tupled.
>
> I don't think there is necessarily a similar restriction on a generic
> function's type parameters, because we don't have the ability to explicitly
> instantiate generic functions anyway.
>
> An alternative wording is along the lines of: "As of this PEP, only a
> single type variable tuple may appear among a generic class's type
> parameters."
>
> def foo(*args: tuple[*Ts1, *Ts2]) -> ...
>
> is already prohibited by "Multiple Unpackings in a Tuple: Not Allowed".
>
> There are three other occurrences of "type parameter list" in the PEP.
> Two of them talk about instantiating generic type aliases and should be
> changed to "type argument list".  The last one is less clear, I can't quite
> parse out what it's trying to say.
>
> On Wed, Jan 12, 2022 at 5:04 PM Guido van Rossum <gu...@python.org> wrote:
>
>> On Wed, Jan 12, 2022 at 4:57 AM Petr Viktorin <pvikt...@redhat.com>
>> wrote:
>>
>>> Matthew Rahtz wrote:
>>> > Hi everyone,
>>> >
>>> > We've got to the stage now with PEP 646 that we're feeling pretty happy
>>> > with it. So far though we've mainly been workshopping it in
>>> typing-sig, so
>>> > as PEP 1 requires we're asking for some feedback here too before
>>> submitting
>>> > it to the steering council.
>>> >
>>> > If you have time over the next couple of weeks, please take a look at
>>> the
>>> > current draft and let us know your thoughts:
>>> > https://www.python.org/dev/peps/pep-0646/ (Note that the final couple
>>> of
>>> > sections are out of date; https://github.com/python/peps/pull/1880
>>> > clarifies which grammar changes would be required, now that PEP 637 has
>>> > been rejected. We also have a second PR in progress at
>>> > https://github.com/python/peps/pull/1881 clarifying some of the
>>> motivation.)
>>> >
>>> > Thanks!
>>> > Matthew and Pradeep
>>>
>>> Hi,
>>> I'm very late to the discussion -- I relied on the typing-sig and SC to
>>> handle this, but now that I'm on the SC, I no longer have that luxury :)
>>> This mail has my own opinions, not necessarily the SC's.
>>>
>>>
>>> I've read the PEP, and I quite like it! It's clear that typing-sig
>>> thought this through very well.
>>> The thing that surprised me is the proposed changes that affect more
>>> than typing annotations. Quite deep in the PEP, the "Grammar Changes"
>>> section explains the (quite exciting) change to make star-unpacking
>>> possible in normal indexing operations, e.g.::
>>>
>>>      idxs_to_select = (1, 2)
>>>      array[0, *idxs_to_select, -1]  # Equivalent to [0, 1, 2, -1]
>>>
>>> However, the PEP is silent about indexing assignment, e.g.::
>>>
>>>      array[0, *idxs_to_select, -1] = 1
>>>
>>> IMO, it would be very confusing to not keep these in sync. If they are,
>>> the assignment change should be documented and tested appropriately. Is
>>> that the plan?
>>>
>>
>> The previous SC approved the PEP despite this.
>>
>> If you want to convince the SC to request this feature parity in the PEP,
>> I won't stop you.
>>
>> But unless that happens I would rather not update the PEP again (it's
>> been tough to get to this point).
>>
>> Maybe you can write a separate PEP? That would probably be simpler for
>> all involved (the PEP 646 authors would not have to be involved, and the
>> separate PEP would be very straightforward.
>>
>>
>>> For a second point, the PEP says:
>>>
>>> > this PEP disallows multiple unpacked TypeVarTuples within a single
>>> type parameter list. This requirement would therefore need to be
>>> implemented in type checking tools themselves rather than at the syntax
>>> level.
>>>
>>> Typing annotations are sometimes used for other things than *static*
>>> typing, and I wouldn't be surprised if type checkers themselves started
>>> allowing this (as a non-standard extension in cases where things aren't
>>> ambiguous):
>>>
>>>      def tprod(Generic[*T1], Generic[*T2]) -> Generic[*T1, *T2]: ...
>>>
>>
>> I don't think that sentence is trying to forbid this. The problem appears
>> in things like
>>
>> def foo(*args: tuple[*Ts1, *Ts2]) -> ...
>>
>> Maybe the wording in the PEP can be imrpoved?
>>
>>
>>> If multiple unpackings in a tuple aren't blocked by the compiler, they
>>> should be tested and documented as syntactically valid annotations --
>>> just not valid static typing annotations (even though other uses are
>>> currently deprecated). In particular, once the compiler allows multiple
>>> unpackings, disallowing them at the syntax level later would mean
>>> breaking backwards compatibility.
>>> Do we share that view?
>>>
>>
>> Agreed that the syntax with multiple stars will not be deprecated at
>> runtime, but type checkers may reject it. (Just as type checkers reject
>> many other programs that would run fine.)
>>
>>
>>> And after reading the PEP again, I'm unclear on some details in the
>>> Aliases section. Could you please clarify these examples for me?
>>>
>>> SplitDataset = Tuple[Array[*Ts], Array[*Ts]]
>>> SplitDataset[Height]  # Valid? What would this be equivalent to?
>>>
>>>
>>> TwoArrays = Tuple[Array[*Ts1], Array[*Ts2]]
>>> TwoArrays[Height]  # Valid? Equivalent to what? How to specify this
>>> fully?
>>>
>>
>> I'll leave this to the PEP authors to address.
>>
>> --
>> --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-Dev mailing list -- python-dev@python.org
>> To unsubscribe send an email to python-dev-le...@python.org
>> https://mail.python.org/mailman3/lists/python-dev.python.org/
>> Message archived at
>> https://mail.python.org/archives/list/python-dev@python.org/message/ZHBIGZQPK6Y5MSAOV3BHU4VRPIUKSJHJ/
>> Code of Conduct: http://python.org/psf/codeofconduct/
>>
>
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/47SKCKPYGTP74Y6TRNL4HXJPVW2LGXUX/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to