Guido van Rossum <gu...@python.org> added the comment:

I'd like to look at this as a case of simplifying something to its simplest 
canonical form, but no simpler. This is what the existing fixed-typevar 
expansion does: e.g. tuple[str, T, T][int] becomes tuple[str, int, int].

I propose that we try to agree on a set of rules for what can be simplified 
further and what cannot, when we have B = C[...]; A = B[...], (IOW A = 
C[...][...]), for various shapes of the subscripts to C and B. Note that what's 
relevant for the second subscript is C[...].__parameters__, so I'll call that 
"left" below.

1. Some edge case seems to be that if *tuple[...] is involved on either side we 
will never simplify. Or perhaps a better rule is that *tuple[...] is never 
simplified away (but fixed items before and after it may be).

2. Another edge case is that if neither side has any starred items we will 
always simplify (since this is the existing behavior in 3.10). This may raise 
an error if the number of subscripts on the right does not match the number of 
parameters on the left.

3. If there's a single *Ts on the left but not on the right, we should be able 
to simplify, which again may raise an error if there are not enough values on 
the right, but if there are more than enough, the excess will be consumed by 
*Ts (in fact that's the only way *Ts is fed).

4. If there's a *Ts on the right but not on the left, we should _not_ simplify, 
since whatever we have on the left serves as a constraint for *Ts. (E.g. 
tuple[int, int][*Ts] constrains *Ts to being (int, int).)

5. If there's exactly one *Ts on the left and one on the right, we _might__ be 
able to simplify if the prefix and suffix of the __parameters__ match the 
prefix and suffix of the subscript on the right. E.g. C[int, T, *Ts, 
float][str, *Ts] can be simplified to C[int, str, *Ts, float]. OTOH C[int, T, 
*Ts, float][*Ts] cannot be simplified -- but we cannot flag it as an error 
either. Note that __parameters__ in this example is (T, Ts); we have to assume 
that typevartuples in __parameters__ are always used as *Ts (since the PEP 
recognizes no valid unstarred uses of Ts).

TBH case 5 is the most complex and I may have overlooked something. I'm more 
sure of cases 1-4.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue47006>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to