17db96d56Sopenharmony_cidoctests = """ 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ciSetup 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ci >>> class AClass: 67db96d56Sopenharmony_ci ... def __init__(self): 77db96d56Sopenharmony_ci ... self._setitem_name = None 87db96d56Sopenharmony_ci ... self._setitem_val = None 97db96d56Sopenharmony_ci ... self._delitem_name = None 107db96d56Sopenharmony_ci ... def __setitem__(self, name, val): 117db96d56Sopenharmony_ci ... self._delitem_name = None 127db96d56Sopenharmony_ci ... self._setitem_name = name 137db96d56Sopenharmony_ci ... self._setitem_val = val 147db96d56Sopenharmony_ci ... def __repr__(self): 157db96d56Sopenharmony_ci ... if self._setitem_name is not None: 167db96d56Sopenharmony_ci ... return f"A[{self._setitem_name}]={self._setitem_val}" 177db96d56Sopenharmony_ci ... elif self._delitem_name is not None: 187db96d56Sopenharmony_ci ... return f"delA[{self._delitem_name}]" 197db96d56Sopenharmony_ci ... def __getitem__(self, name): 207db96d56Sopenharmony_ci ... return ParameterisedA(name) 217db96d56Sopenharmony_ci ... def __delitem__(self, name): 227db96d56Sopenharmony_ci ... self._setitem_name = None 237db96d56Sopenharmony_ci ... self._delitem_name = name 247db96d56Sopenharmony_ci ... 257db96d56Sopenharmony_ci >>> class ParameterisedA: 267db96d56Sopenharmony_ci ... def __init__(self, name): 277db96d56Sopenharmony_ci ... self._name = name 287db96d56Sopenharmony_ci ... def __repr__(self): 297db96d56Sopenharmony_ci ... return f"A[{self._name}]" 307db96d56Sopenharmony_ci ... def __iter__(self): 317db96d56Sopenharmony_ci ... for p in self._name: 327db96d56Sopenharmony_ci ... yield p 337db96d56Sopenharmony_ci >>> class B: 347db96d56Sopenharmony_ci ... def __iter__(self): 357db96d56Sopenharmony_ci ... yield StarredB() 367db96d56Sopenharmony_ci ... def __repr__(self): 377db96d56Sopenharmony_ci ... return "B" 387db96d56Sopenharmony_ci >>> class StarredB: 397db96d56Sopenharmony_ci ... def __repr__(self): 407db96d56Sopenharmony_ci ... return "StarredB" 417db96d56Sopenharmony_ci >>> A = AClass() 427db96d56Sopenharmony_ci >>> b = B() 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_ciSlices that are supposed to work, starring our custom B class 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_ci >>> A[*b] 477db96d56Sopenharmony_ci A[(StarredB,)] 487db96d56Sopenharmony_ci >>> A[*b] = 1; A 497db96d56Sopenharmony_ci A[(StarredB,)]=1 507db96d56Sopenharmony_ci >>> del A[*b]; A 517db96d56Sopenharmony_ci delA[(StarredB,)] 527db96d56Sopenharmony_ci 537db96d56Sopenharmony_ci >>> A[*b, *b] 547db96d56Sopenharmony_ci A[(StarredB, StarredB)] 557db96d56Sopenharmony_ci >>> A[*b, *b] = 1; A 567db96d56Sopenharmony_ci A[(StarredB, StarredB)]=1 577db96d56Sopenharmony_ci >>> del A[*b, *b]; A 587db96d56Sopenharmony_ci delA[(StarredB, StarredB)] 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_ci >>> A[b, *b] 617db96d56Sopenharmony_ci A[(B, StarredB)] 627db96d56Sopenharmony_ci >>> A[b, *b] = 1; A 637db96d56Sopenharmony_ci A[(B, StarredB)]=1 647db96d56Sopenharmony_ci >>> del A[b, *b]; A 657db96d56Sopenharmony_ci delA[(B, StarredB)] 667db96d56Sopenharmony_ci 677db96d56Sopenharmony_ci >>> A[*b, b] 687db96d56Sopenharmony_ci A[(StarredB, B)] 697db96d56Sopenharmony_ci >>> A[*b, b] = 1; A 707db96d56Sopenharmony_ci A[(StarredB, B)]=1 717db96d56Sopenharmony_ci >>> del A[*b, b]; A 727db96d56Sopenharmony_ci delA[(StarredB, B)] 737db96d56Sopenharmony_ci 747db96d56Sopenharmony_ci >>> A[b, b, *b] 757db96d56Sopenharmony_ci A[(B, B, StarredB)] 767db96d56Sopenharmony_ci >>> A[b, b, *b] = 1; A 777db96d56Sopenharmony_ci A[(B, B, StarredB)]=1 787db96d56Sopenharmony_ci >>> del A[b, b, *b]; A 797db96d56Sopenharmony_ci delA[(B, B, StarredB)] 807db96d56Sopenharmony_ci 817db96d56Sopenharmony_ci >>> A[*b, b, b] 827db96d56Sopenharmony_ci A[(StarredB, B, B)] 837db96d56Sopenharmony_ci >>> A[*b, b, b] = 1; A 847db96d56Sopenharmony_ci A[(StarredB, B, B)]=1 857db96d56Sopenharmony_ci >>> del A[*b, b, b]; A 867db96d56Sopenharmony_ci delA[(StarredB, B, B)] 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci >>> A[b, *b, b] 897db96d56Sopenharmony_ci A[(B, StarredB, B)] 907db96d56Sopenharmony_ci >>> A[b, *b, b] = 1; A 917db96d56Sopenharmony_ci A[(B, StarredB, B)]=1 927db96d56Sopenharmony_ci >>> del A[b, *b, b]; A 937db96d56Sopenharmony_ci delA[(B, StarredB, B)] 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_ci >>> A[b, b, *b, b] 967db96d56Sopenharmony_ci A[(B, B, StarredB, B)] 977db96d56Sopenharmony_ci >>> A[b, b, *b, b] = 1; A 987db96d56Sopenharmony_ci A[(B, B, StarredB, B)]=1 997db96d56Sopenharmony_ci >>> del A[b, b, *b, b]; A 1007db96d56Sopenharmony_ci delA[(B, B, StarredB, B)] 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci >>> A[b, *b, b, b] 1037db96d56Sopenharmony_ci A[(B, StarredB, B, B)] 1047db96d56Sopenharmony_ci >>> A[b, *b, b, b] = 1; A 1057db96d56Sopenharmony_ci A[(B, StarredB, B, B)]=1 1067db96d56Sopenharmony_ci >>> del A[b, *b, b, b]; A 1077db96d56Sopenharmony_ci delA[(B, StarredB, B, B)] 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci >>> A[A[b, *b, b]] 1107db96d56Sopenharmony_ci A[A[(B, StarredB, B)]] 1117db96d56Sopenharmony_ci >>> A[A[b, *b, b]] = 1; A 1127db96d56Sopenharmony_ci A[A[(B, StarredB, B)]]=1 1137db96d56Sopenharmony_ci >>> del A[A[b, *b, b]]; A 1147db96d56Sopenharmony_ci delA[A[(B, StarredB, B)]] 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci >>> A[*A[b, *b, b]] 1177db96d56Sopenharmony_ci A[(B, StarredB, B)] 1187db96d56Sopenharmony_ci >>> A[*A[b, *b, b]] = 1; A 1197db96d56Sopenharmony_ci A[(B, StarredB, B)]=1 1207db96d56Sopenharmony_ci >>> del A[*A[b, *b, b]]; A 1217db96d56Sopenharmony_ci delA[(B, StarredB, B)] 1227db96d56Sopenharmony_ci 1237db96d56Sopenharmony_ci >>> A[b, ...] 1247db96d56Sopenharmony_ci A[(B, Ellipsis)] 1257db96d56Sopenharmony_ci >>> A[b, ...] = 1; A 1267db96d56Sopenharmony_ci A[(B, Ellipsis)]=1 1277db96d56Sopenharmony_ci >>> del A[b, ...]; A 1287db96d56Sopenharmony_ci delA[(B, Ellipsis)] 1297db96d56Sopenharmony_ci 1307db96d56Sopenharmony_ci >>> A[*A[b, ...]] 1317db96d56Sopenharmony_ci A[(B, Ellipsis)] 1327db96d56Sopenharmony_ci >>> A[*A[b, ...]] = 1; A 1337db96d56Sopenharmony_ci A[(B, Ellipsis)]=1 1347db96d56Sopenharmony_ci >>> del A[*A[b, ...]]; A 1357db96d56Sopenharmony_ci delA[(B, Ellipsis)] 1367db96d56Sopenharmony_ci 1377db96d56Sopenharmony_ciSlices that are supposed to work, starring a list 1387db96d56Sopenharmony_ci 1397db96d56Sopenharmony_ci >>> l = [1, 2, 3] 1407db96d56Sopenharmony_ci 1417db96d56Sopenharmony_ci >>> A[*l] 1427db96d56Sopenharmony_ci A[(1, 2, 3)] 1437db96d56Sopenharmony_ci >>> A[*l] = 1; A 1447db96d56Sopenharmony_ci A[(1, 2, 3)]=1 1457db96d56Sopenharmony_ci >>> del A[*l]; A 1467db96d56Sopenharmony_ci delA[(1, 2, 3)] 1477db96d56Sopenharmony_ci 1487db96d56Sopenharmony_ci >>> A[*l, 4] 1497db96d56Sopenharmony_ci A[(1, 2, 3, 4)] 1507db96d56Sopenharmony_ci >>> A[*l, 4] = 1; A 1517db96d56Sopenharmony_ci A[(1, 2, 3, 4)]=1 1527db96d56Sopenharmony_ci >>> del A[*l, 4]; A 1537db96d56Sopenharmony_ci delA[(1, 2, 3, 4)] 1547db96d56Sopenharmony_ci 1557db96d56Sopenharmony_ci >>> A[0, *l] 1567db96d56Sopenharmony_ci A[(0, 1, 2, 3)] 1577db96d56Sopenharmony_ci >>> A[0, *l] = 1; A 1587db96d56Sopenharmony_ci A[(0, 1, 2, 3)]=1 1597db96d56Sopenharmony_ci >>> del A[0, *l]; A 1607db96d56Sopenharmony_ci delA[(0, 1, 2, 3)] 1617db96d56Sopenharmony_ci 1627db96d56Sopenharmony_ci >>> A[1:2, *l] 1637db96d56Sopenharmony_ci A[(slice(1, 2, None), 1, 2, 3)] 1647db96d56Sopenharmony_ci >>> A[1:2, *l] = 1; A 1657db96d56Sopenharmony_ci A[(slice(1, 2, None), 1, 2, 3)]=1 1667db96d56Sopenharmony_ci >>> del A[1:2, *l]; A 1677db96d56Sopenharmony_ci delA[(slice(1, 2, None), 1, 2, 3)] 1687db96d56Sopenharmony_ci 1697db96d56Sopenharmony_ci >>> repr(A[1:2, *l]) == repr(A[1:2, 1, 2, 3]) 1707db96d56Sopenharmony_ci True 1717db96d56Sopenharmony_ci 1727db96d56Sopenharmony_ciSlices that are supposed to work, starring a tuple 1737db96d56Sopenharmony_ci 1747db96d56Sopenharmony_ci >>> t = (1, 2, 3) 1757db96d56Sopenharmony_ci 1767db96d56Sopenharmony_ci >>> A[*t] 1777db96d56Sopenharmony_ci A[(1, 2, 3)] 1787db96d56Sopenharmony_ci >>> A[*t] = 1; A 1797db96d56Sopenharmony_ci A[(1, 2, 3)]=1 1807db96d56Sopenharmony_ci >>> del A[*t]; A 1817db96d56Sopenharmony_ci delA[(1, 2, 3)] 1827db96d56Sopenharmony_ci 1837db96d56Sopenharmony_ci >>> A[*t, 4] 1847db96d56Sopenharmony_ci A[(1, 2, 3, 4)] 1857db96d56Sopenharmony_ci >>> A[*t, 4] = 1; A 1867db96d56Sopenharmony_ci A[(1, 2, 3, 4)]=1 1877db96d56Sopenharmony_ci >>> del A[*t, 4]; A 1887db96d56Sopenharmony_ci delA[(1, 2, 3, 4)] 1897db96d56Sopenharmony_ci 1907db96d56Sopenharmony_ci >>> A[0, *t] 1917db96d56Sopenharmony_ci A[(0, 1, 2, 3)] 1927db96d56Sopenharmony_ci >>> A[0, *t] = 1; A 1937db96d56Sopenharmony_ci A[(0, 1, 2, 3)]=1 1947db96d56Sopenharmony_ci >>> del A[0, *t]; A 1957db96d56Sopenharmony_ci delA[(0, 1, 2, 3)] 1967db96d56Sopenharmony_ci 1977db96d56Sopenharmony_ci >>> A[1:2, *t] 1987db96d56Sopenharmony_ci A[(slice(1, 2, None), 1, 2, 3)] 1997db96d56Sopenharmony_ci >>> A[1:2, *t] = 1; A 2007db96d56Sopenharmony_ci A[(slice(1, 2, None), 1, 2, 3)]=1 2017db96d56Sopenharmony_ci >>> del A[1:2, *t]; A 2027db96d56Sopenharmony_ci delA[(slice(1, 2, None), 1, 2, 3)] 2037db96d56Sopenharmony_ci 2047db96d56Sopenharmony_ci >>> repr(A[1:2, *t]) == repr(A[1:2, 1, 2, 3]) 2057db96d56Sopenharmony_ci True 2067db96d56Sopenharmony_ci 2077db96d56Sopenharmony_ciStarring an expression (rather than a name) in a slice 2087db96d56Sopenharmony_ci 2097db96d56Sopenharmony_ci >>> def returns_list(): 2107db96d56Sopenharmony_ci ... return [1, 2, 3] 2117db96d56Sopenharmony_ci 2127db96d56Sopenharmony_ci >>> A[returns_list()] 2137db96d56Sopenharmony_ci A[[1, 2, 3]] 2147db96d56Sopenharmony_ci >>> A[returns_list()] = 1; A 2157db96d56Sopenharmony_ci A[[1, 2, 3]]=1 2167db96d56Sopenharmony_ci >>> del A[returns_list()]; A 2177db96d56Sopenharmony_ci delA[[1, 2, 3]] 2187db96d56Sopenharmony_ci 2197db96d56Sopenharmony_ci >>> A[returns_list(), 4] 2207db96d56Sopenharmony_ci A[([1, 2, 3], 4)] 2217db96d56Sopenharmony_ci >>> A[returns_list(), 4] = 1; A 2227db96d56Sopenharmony_ci A[([1, 2, 3], 4)]=1 2237db96d56Sopenharmony_ci >>> del A[returns_list(), 4]; A 2247db96d56Sopenharmony_ci delA[([1, 2, 3], 4)] 2257db96d56Sopenharmony_ci 2267db96d56Sopenharmony_ci >>> A[*returns_list()] 2277db96d56Sopenharmony_ci A[(1, 2, 3)] 2287db96d56Sopenharmony_ci >>> A[*returns_list()] = 1; A 2297db96d56Sopenharmony_ci A[(1, 2, 3)]=1 2307db96d56Sopenharmony_ci >>> del A[*returns_list()]; A 2317db96d56Sopenharmony_ci delA[(1, 2, 3)] 2327db96d56Sopenharmony_ci 2337db96d56Sopenharmony_ci >>> A[*returns_list(), 4] 2347db96d56Sopenharmony_ci A[(1, 2, 3, 4)] 2357db96d56Sopenharmony_ci >>> A[*returns_list(), 4] = 1; A 2367db96d56Sopenharmony_ci A[(1, 2, 3, 4)]=1 2377db96d56Sopenharmony_ci >>> del A[*returns_list(), 4]; A 2387db96d56Sopenharmony_ci delA[(1, 2, 3, 4)] 2397db96d56Sopenharmony_ci 2407db96d56Sopenharmony_ci >>> A[0, *returns_list()] 2417db96d56Sopenharmony_ci A[(0, 1, 2, 3)] 2427db96d56Sopenharmony_ci >>> A[0, *returns_list()] = 1; A 2437db96d56Sopenharmony_ci A[(0, 1, 2, 3)]=1 2447db96d56Sopenharmony_ci >>> del A[0, *returns_list()]; A 2457db96d56Sopenharmony_ci delA[(0, 1, 2, 3)] 2467db96d56Sopenharmony_ci 2477db96d56Sopenharmony_ci >>> A[*returns_list(), *returns_list()] 2487db96d56Sopenharmony_ci A[(1, 2, 3, 1, 2, 3)] 2497db96d56Sopenharmony_ci >>> A[*returns_list(), *returns_list()] = 1; A 2507db96d56Sopenharmony_ci A[(1, 2, 3, 1, 2, 3)]=1 2517db96d56Sopenharmony_ci >>> del A[*returns_list(), *returns_list()]; A 2527db96d56Sopenharmony_ci delA[(1, 2, 3, 1, 2, 3)] 2537db96d56Sopenharmony_ci 2547db96d56Sopenharmony_ciUsing both a starred object and a start:stop in a slice 2557db96d56Sopenharmony_ci(See also tests in test_syntax confirming that starring *inside* a start:stop 2567db96d56Sopenharmony_ciis *not* valid syntax.) 2577db96d56Sopenharmony_ci 2587db96d56Sopenharmony_ci >>> A[1:2, *b] 2597db96d56Sopenharmony_ci A[(slice(1, 2, None), StarredB)] 2607db96d56Sopenharmony_ci >>> A[*b, 1:2] 2617db96d56Sopenharmony_ci A[(StarredB, slice(1, 2, None))] 2627db96d56Sopenharmony_ci >>> A[1:2, *b, 1:2] 2637db96d56Sopenharmony_ci A[(slice(1, 2, None), StarredB, slice(1, 2, None))] 2647db96d56Sopenharmony_ci >>> A[*b, 1:2, *b] 2657db96d56Sopenharmony_ci A[(StarredB, slice(1, 2, None), StarredB)] 2667db96d56Sopenharmony_ci 2677db96d56Sopenharmony_ci >>> A[1:, *b] 2687db96d56Sopenharmony_ci A[(slice(1, None, None), StarredB)] 2697db96d56Sopenharmony_ci >>> A[*b, 1:] 2707db96d56Sopenharmony_ci A[(StarredB, slice(1, None, None))] 2717db96d56Sopenharmony_ci >>> A[1:, *b, 1:] 2727db96d56Sopenharmony_ci A[(slice(1, None, None), StarredB, slice(1, None, None))] 2737db96d56Sopenharmony_ci >>> A[*b, 1:, *b] 2747db96d56Sopenharmony_ci A[(StarredB, slice(1, None, None), StarredB)] 2757db96d56Sopenharmony_ci 2767db96d56Sopenharmony_ci >>> A[:1, *b] 2777db96d56Sopenharmony_ci A[(slice(None, 1, None), StarredB)] 2787db96d56Sopenharmony_ci >>> A[*b, :1] 2797db96d56Sopenharmony_ci A[(StarredB, slice(None, 1, None))] 2807db96d56Sopenharmony_ci >>> A[:1, *b, :1] 2817db96d56Sopenharmony_ci A[(slice(None, 1, None), StarredB, slice(None, 1, None))] 2827db96d56Sopenharmony_ci >>> A[*b, :1, *b] 2837db96d56Sopenharmony_ci A[(StarredB, slice(None, 1, None), StarredB)] 2847db96d56Sopenharmony_ci 2857db96d56Sopenharmony_ci >>> A[:, *b] 2867db96d56Sopenharmony_ci A[(slice(None, None, None), StarredB)] 2877db96d56Sopenharmony_ci >>> A[*b, :] 2887db96d56Sopenharmony_ci A[(StarredB, slice(None, None, None))] 2897db96d56Sopenharmony_ci >>> A[:, *b, :] 2907db96d56Sopenharmony_ci A[(slice(None, None, None), StarredB, slice(None, None, None))] 2917db96d56Sopenharmony_ci >>> A[*b, :, *b] 2927db96d56Sopenharmony_ci A[(StarredB, slice(None, None, None), StarredB)] 2937db96d56Sopenharmony_ci 2947db96d56Sopenharmony_ci*args annotated as starred expression 2957db96d56Sopenharmony_ci 2967db96d56Sopenharmony_ci >>> def f1(*args: *b): pass 2977db96d56Sopenharmony_ci >>> f1.__annotations__ 2987db96d56Sopenharmony_ci {'args': StarredB} 2997db96d56Sopenharmony_ci 3007db96d56Sopenharmony_ci >>> def f2(*args: *b, arg1): pass 3017db96d56Sopenharmony_ci >>> f2.__annotations__ 3027db96d56Sopenharmony_ci {'args': StarredB} 3037db96d56Sopenharmony_ci 3047db96d56Sopenharmony_ci >>> def f3(*args: *b, arg1: int): pass 3057db96d56Sopenharmony_ci >>> f3.__annotations__ 3067db96d56Sopenharmony_ci {'args': StarredB, 'arg1': <class 'int'>} 3077db96d56Sopenharmony_ci 3087db96d56Sopenharmony_ci >>> def f4(*args: *b, arg1: int = 2): pass 3097db96d56Sopenharmony_ci >>> f4.__annotations__ 3107db96d56Sopenharmony_ci {'args': StarredB, 'arg1': <class 'int'>} 3117db96d56Sopenharmony_ci 3127db96d56Sopenharmony_ci >>> def f5(*args: *b = (1,)): pass 3137db96d56Sopenharmony_ci Traceback (most recent call last): 3147db96d56Sopenharmony_ci ... 3157db96d56Sopenharmony_ci SyntaxError: invalid syntax 3167db96d56Sopenharmony_ci""" 3177db96d56Sopenharmony_ci 3187db96d56Sopenharmony_ci__test__ = {'doctests' : doctests} 3197db96d56Sopenharmony_ci 3207db96d56Sopenharmony_cidef test_main(verbose=False): 3217db96d56Sopenharmony_ci from test import support 3227db96d56Sopenharmony_ci from test import test_pep646_syntax 3237db96d56Sopenharmony_ci support.run_doctest(test_pep646_syntax, verbose) 3247db96d56Sopenharmony_ci 3257db96d56Sopenharmony_ciif __name__ == "__main__": 3267db96d56Sopenharmony_ci test_main(verbose=True) 327