Yes, exactly.

Specifically, the "wrong" example in section 'Multiple Type Variable
Tuples: Not Allowed' suggests that maybe what is wrong is that `Generic`
was given more than one unpacked type variable tuple.  The actual problem
is a consequence of that: `class Array` has more than one type variable
tuple as type parameters.  (But there are other ways that could happen and
all of them should be wrong.)

I think it might be good to say that explicitly in that section.

On Thu, Jan 13, 2022 at 4:18 PM Matthew Rahtz <mra...@google.com> wrote:

> 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/2IAEW265F5FM6HW57EJBF5GATRFZ45QK/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to