@@ -754,89 +754,89 @@ class C(Generic[*Ts]): pass
754
754
tests = [
755
755
# Alias # Args # Expected result
756
756
('C[*Ts]' , '[()]' , 'C[()]' ),
757
- ('tuple[*Ts]' , '[()]' , 'TypeError' ), # Should be tuple[()]
757
+ ('tuple[*Ts]' , '[()]' , 'tuple[()]' ),
758
758
('Tuple[*Ts]' , '[()]' , 'Tuple[()]' ),
759
759
760
760
('C[*Ts]' , '[int]' , 'C[int]' ),
761
- ('tuple[*Ts]' , '[int]' , 'tuple[( int,), ]' ), # Should be tuple[int]
761
+ ('tuple[*Ts]' , '[int]' , 'tuple[int]' ),
762
762
('Tuple[*Ts]' , '[int]' , 'Tuple[int]' ),
763
763
764
764
('C[*Ts]' , '[int, str]' , 'C[int, str]' ),
765
- ('tuple[*Ts]' , '[int, str]' , 'TypeError' ), # Should be tuple[int, str]
765
+ ('tuple[*Ts]' , '[int, str]' , 'tuple[int, str]' ),
766
766
('Tuple[*Ts]' , '[int, str]' , 'Tuple[int, str]' ),
767
767
768
768
('C[*Ts]' , '[*tuple_type[int]]' , 'C[*tuple_type[int]]' ), # Should be C[int]
769
- ('tuple[*Ts]' , '[*tuple_type[int]]' , 'tuple[( *tuple_type[int],), ]' ), # Should be tuple[int]
769
+ ('tuple[*Ts]' , '[*tuple_type[int]]' , 'tuple[*tuple_type[int]]' ), # Should be tuple[int]
770
770
('Tuple[*Ts]' , '[*tuple_type[int]]' , 'Tuple[*tuple_type[int]]' ), # Should be Tuple[int]
771
771
772
772
('C[*Ts]' , '[*tuple_type[*Ts]]' , 'C[*tuple_type[*Ts]]' ), # Should be C[*Ts]
773
- ('tuple[*Ts]' , '[*tuple_type[*Ts]]' , 'tuple[( *tuple_type[*Ts],), ]' ), # Should be tuple[*Ts]
773
+ ('tuple[*Ts]' , '[*tuple_type[*Ts]]' , 'tuple[*tuple_type[*Ts]]' ), # Should be tuple[*Ts]
774
774
('Tuple[*Ts]' , '[*tuple_type[*Ts]]' , 'Tuple[*tuple_type[*Ts]]' ), # Should be Tuple[*Ts]
775
775
776
776
('C[*Ts]' , '[*tuple_type[int, str]]' , 'C[*tuple_type[int, str]]' ), # Should be C[int, str]
777
- ('tuple[*Ts]' , '[*tuple_type[int, str]]' , 'tuple[( *tuple_type[int, str],), ]' ), # Should be tuple[int, str]
777
+ ('tuple[*Ts]' , '[*tuple_type[int, str]]' , 'tuple[*tuple_type[int, str]]' ), # Should be tuple[int, str]
778
778
('Tuple[*Ts]' , '[*tuple_type[int, str]]' , 'Tuple[*tuple_type[int, str]]' ), # Should be Tuple[int, str]
779
779
780
780
('C[*Ts]' , '[tuple_type[int, ...]]' , 'C[tuple_type[int, ...]]' ),
781
- ('tuple[*Ts]' , '[tuple_type[int, ...]]' , 'tuple[( tuple_type[int, ...],), ]' ), # Should be tuple[tuple_type[int, ...]]
781
+ ('tuple[*Ts]' , '[tuple_type[int, ...]]' , 'tuple[tuple_type[int, ...]]' ),
782
782
('Tuple[*Ts]' , '[tuple_type[int, ...]]' , 'Tuple[tuple_type[int, ...]]' ),
783
783
784
784
('C[*Ts]' , '[tuple_type[int, ...], tuple_type[str, ...]]' , 'C[tuple_type[int, ...], tuple_type[str, ...]]' ),
785
- ('tuple[*Ts]' , '[tuple_type[int, ...], tuple_type[str, ...]]' , 'TypeError' ), # Should be tuple[tuple_type[int, ...], tuple_type[str, ...]]
785
+ ('tuple[*Ts]' , '[tuple_type[int, ...], tuple_type[str, ...]]' , 'tuple[tuple_type[int, ...], tuple_type[str, ...]]' ),
786
786
('Tuple[*Ts]' , '[tuple_type[int, ...], tuple_type[str, ...]]' , 'Tuple[tuple_type[int, ...], tuple_type[str, ...]]' ),
787
787
788
788
('C[*Ts]' , '[*tuple_type[int, ...]]' , 'C[*tuple_type[int, ...]]' ),
789
- ('tuple[*Ts]' , '[*tuple_type[int, ...]]' , 'tuple[( *tuple_type[int, ...],), ]' ), # Should be tuple[*tuple_type[int, ...]]
789
+ ('tuple[*Ts]' , '[*tuple_type[int, ...]]' , 'tuple[*tuple_type[int, ...]]' ),
790
790
('Tuple[*Ts]' , '[*tuple_type[int, ...]]' , 'Tuple[*tuple_type[int, ...]]' ),
791
791
792
792
# Technically, multiple unpackings are forbidden by PEP 646, but we
793
793
# choose to be less restrictive at runtime, to allow folks room
794
794
# to experiment. So all three of these should be valid.
795
795
('C[*Ts]' , '[*tuple_type[int, ...], *tuple_type[str, ...]]' , 'C[*tuple_type[int, ...], *tuple_type[str, ...]]' ),
796
- # Should be tuple[*tuple_type[int, ...], *tuple_type[str, ...]], to match the other two.
797
- ('tuple[*Ts]' , '[*tuple_type[int, ...], *tuple_type[str, ...]]' , 'TypeError' ),
796
+ ('tuple[*Ts]' , '[*tuple_type[int, ...], *tuple_type[str, ...]]' , 'tuple[*tuple_type[int, ...], *tuple_type[str, ...]]' ),
798
797
('Tuple[*Ts]' , '[*tuple_type[int, ...], *tuple_type[str, ...]]' , 'Tuple[*tuple_type[int, ...], *tuple_type[str, ...]]' ),
799
798
800
799
('C[*Ts]' , '[*Ts]' , 'C[*Ts]' ),
801
- ('tuple[*Ts]' , '[*Ts]' , 'tuple[( *Ts,), ]' ), # Should be tuple[*Ts]
800
+ ('tuple[*Ts]' , '[*Ts]' , 'tuple[*Ts]' ),
802
801
('Tuple[*Ts]' , '[*Ts]' , 'Tuple[*Ts]' ),
803
802
804
803
('C[*Ts]' , '[T, *Ts]' , 'C[T, *Ts]' ),
805
- ('tuple[*Ts]' , '[T, *Ts]' , 'TypeError' ), # Should be tuple[T, *Ts]
804
+ ('tuple[*Ts]' , '[T, *Ts]' , 'tuple[T, *Ts]' ),
806
805
('Tuple[*Ts]' , '[T, *Ts]' , 'Tuple[T, *Ts]' ),
807
806
808
807
('C[*Ts]' , '[*Ts, T]' , 'C[*Ts, T]' ),
809
- ('tuple[*Ts]' , '[*Ts, T]' , 'TypeError' ), # Should be tuple[*Ts, T]
808
+ ('tuple[*Ts]' , '[*Ts, T]' , 'tuple[*Ts, T]' ),
810
809
('Tuple[*Ts]' , '[*Ts, T]' , 'Tuple[*Ts, T]' ),
811
810
812
811
('C[T, *Ts]' , '[int]' , 'C[int]' ),
813
- ('tuple[T, *Ts]' , '[int]' , 'TypeError' ), # Should be tuple[int]
812
+ ('tuple[T, *Ts]' , '[int]' , 'tuple[int]' ),
814
813
('Tuple[T, *Ts]' , '[int]' , 'Tuple[int]' ),
815
814
816
815
('C[T, *Ts]' , '[int, str]' , 'C[int, str]' ),
817
- ('tuple[T, *Ts]' , '[int, str]' , 'tuple[int, ( str,) ]' ), # Should be tuple[int, str]
816
+ ('tuple[T, *Ts]' , '[int, str]' , 'tuple[int, str]' ),
818
817
('Tuple[T, *Ts]' , '[int, str]' , 'Tuple[int, str]' ),
819
818
820
819
('C[T, *Ts]' , '[int, str, bool]' , 'C[int, str, bool]' ),
821
- ('tuple[T, *Ts]' , '[int, str, bool]' , 'TypeError' ), # Should be tuple[int, str, bool]
820
+ ('tuple[T, *Ts]' , '[int, str, bool]' , 'tuple[int, str, bool]' ),
822
821
('Tuple[T, *Ts]' , '[int, str, bool]' , 'Tuple[int, str, bool]' ),
823
822
824
823
('C[T, *Ts]' , '[*tuple[int, ...]]' , 'C[*tuple[int, ...]]' ), # Should be C[int, *tuple[int, ...]]
825
824
('C[T, *Ts]' , '[*Tuple[int, ...]]' , 'TypeError' ), # Ditto
826
- ('tuple[T, *Ts]' , '[*tuple_type[int, ...]]' , 'TypeError' ), # Should be tuple[int, *tuple[int, ...]]
827
- ('Tuple[T, *Ts]' , '[*tuple[int, ...]]' , 'Tuple[*tuple[int, ...]]' ), # Ditto
828
- ('Tuple[T, *Ts]' , '[*Tuple[int, ...]]' , 'TypeError' ), # Ditto
825
+ ('tuple[T, *Ts]' , '[*tuple[int, ...]]' , 'tuple[*tuple[int, ...]]' ), # Should be tuple[int, *tuple[int, ...]]
826
+ ('tuple[T, *Ts]' , '[*Tuple[int, ...]]' , 'TypeError' ), # Should be tuple[int, *Tuple[int, ...]]
827
+ ('Tuple[T, *Ts]' , '[*tuple[int, ...]]' , 'Tuple[*tuple[int, ...]]' ), # Should be Tuple[int, *tuple[int, ...]]
828
+ ('Tuple[T, *Ts]' , '[*Tuple[int, ...]]' , 'TypeError' ), # Should be Tuple[int, *Tuple[int, ...]]
829
829
830
830
('C[*Ts, T]' , '[int]' , 'C[int]' ),
831
- ('tuple[*Ts, T]' , '[int]' , 'TypeError' ), # Should be tuple[int]
831
+ ('tuple[*Ts, T]' , '[int]' , 'tuple[int]' ),
832
832
('Tuple[*Ts, T]' , '[int]' , 'Tuple[int]' ),
833
833
834
834
('C[*Ts, T]' , '[int, str]' , 'C[int, str]' ),
835
- ('tuple[*Ts, T]' , '[int, str]' , 'tuple[( int,), str]' ), # Should be tuple[int, str]
835
+ ('tuple[*Ts, T]' , '[int, str]' , 'tuple[int, str]' ),
836
836
('Tuple[*Ts, T]' , '[int, str]' , 'Tuple[int, str]' ),
837
837
838
838
('C[*Ts, T]' , '[int, str, bool]' , 'C[int, str, bool]' ),
839
- ('tuple[*Ts, T]' , '[int, str, bool]' , 'TypeError' ), # Should be tuple[int, str, bool]
839
+ ('tuple[*Ts, T]' , '[int, str, bool]' , 'tuple[int, str, bool]' ),
840
840
('Tuple[*Ts, T]' , '[int, str, bool]' , 'Tuple[int, str, bool]' ),
841
841
842
842
('generic[T, *tuple_type[int, ...]]' , '[str]' , 'generic[str, *tuple_type[int, ...]]' ),
@@ -945,7 +945,7 @@ def test_var_substitution(self):
945
945
T2 = TypeVar ('T2' )
946
946
class G (Generic [Unpack [Ts ]]): pass
947
947
948
- for A in G , Tuple :
948
+ for A in G , Tuple , tuple :
949
949
B = A [Unpack [Ts ]]
950
950
self .assertEqual (B [()], A [()])
951
951
self .assertEqual (B [float ], A [float ])
@@ -984,6 +984,21 @@ def test_bad_var_substitution(self):
984
984
T2 = TypeVar ('T2' )
985
985
class G (Generic [Unpack [Ts ]]): pass
986
986
987
+ for A in G , Tuple , tuple :
988
+ B = A [Ts ]
989
+ with self .assertRaises (TypeError ):
990
+ B [int , str ]
991
+
992
+ C = A [T , T2 ]
993
+ with self .assertRaises (TypeError ):
994
+ C [Unpack [Ts ]]
995
+
996
+ def test_repr_is_correct (self ):
997
+ Ts = TypeVarTuple ('Ts' )
998
+ T = TypeVar ('T' )
999
+ T2 = TypeVar ('T2' )
1000
+ class G (Generic [Unpack [Ts ]]): pass
1001
+
987
1002
for A in G , Tuple :
988
1003
B = A [T , Unpack [Ts ], str , T2 ]
989
1004
with self .assertRaises (TypeError ):
0 commit comments