Q_cSSKrSSKrSSKrSSKrSSKrSSKJr Sr"SS\R5r S\0r Sr \ S:Xa\R"5 gg) N) BrokenItera ########### Tests borrowed from or inspired by test_genexps.py ############ Test simple loop with conditional >>> sum([i*i for i in range(100) if i&1 == 1]) 166650 Test simple nesting >>> [(i,j) for i in range(3) for j in range(4)] [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3)] Test nesting with the inner expression dependent on the outer >>> [(i,j) for i in range(4) for j in range(i)] [(1, 0), (2, 0), (2, 1), (3, 0), (3, 1), (3, 2)] Test the idiom for temporary variable assignment in comprehensions. >>> [j*j for i in range(4) for j in [i+1]] [1, 4, 9, 16] >>> [j*k for i in range(4) for j in [i+1] for k in [j+1]] [2, 6, 12, 20] >>> [j*k for i in range(4) for j, k in [(i+1, i+2)]] [2, 6, 12, 20] Not assignment >>> [i*i for i in [*range(4)]] [0, 1, 4, 9] >>> [i*i for i in (*range(4),)] [0, 1, 4, 9] Make sure the induction variable is not exposed >>> i = 20 >>> sum([i*i for i in range(100)]) 328350 >>> i 20 Verify that syntax error's are raised for listcomps used as lvalues >>> [y for y in (1,2)] = 10 # doctest: +IGNORE_EXCEPTION_DETAIL Traceback (most recent call last): ... SyntaxError: ... >>> [y for y in (1,2)] += 10 # doctest: +IGNORE_EXCEPTION_DETAIL Traceback (most recent call last): ... SyntaxError: ... ########### Tests borrowed from or inspired by test_generators.py ############ Make a nested list comprehension that acts like range() >>> def frange(n): ... return [i for i in range(n)] >>> frange(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Same again, only as a lambda expression instead of a function definition >>> lrange = lambda n: [i for i in range(n)] >>> lrange(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Generators can call other generators: >>> def grange(n): ... for x in [i for i in range(n)]: ... yield x >>> list(grange(5)) [0, 1, 2, 3, 4] Make sure that None is a valid return value >>> [None for i in range(10)] [None, None, None, None, None, None, None, None, None, None] c^\rSrSrSSSS\4SjrSrSrSrU4Sjr S r S r S r S r S rSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSr S r!S!r"S"r#S#r$S$r%S%r&S&r'S'r(S(r)S)r*S*r+S+r,S,r-S-r.S.r/S/r0S0r1S1r2S2r3S3r4S4r5S5r6S6r7S7r8S8r9S9r:S:r;S;rS>r?S?r@SrAU=rB$)@ListComprehensionTestbNc [R"U5nU=(d /SQnUGHnURUS9 US:Xa<[R"S5R[R"US5S9nSn OGUS:Xa<[R"S 5R[R"US5S9nS n OUnS n U(aUR 5O0n U"X5 U=(d 0R 5HupURU "X5X5 M SSS5 GM g!Ua%n UR[U 5U5 Sn A N4Sn A ff=f!,(df  GME=f) N)moduleclassfunction)scoper zZ class _C: {code} z )codec [USU5$)N_C)getattrmoddictnames :/opt/alt/python313/lib64/python3.13/test/test_listcomps.py get_output:ListComprehensionTest._check_in_scopes..get_outputns&wt}d;;r z def _f(): {code} return locals() _out = _f() cUSU$)N_outrrs rrrws&vt44rc X$Nrrs rrr{s &},r) textwrapdedentsubTestformatindentcopyitems assertEqualassertIstype)selfr outputsnsscopesraises exec_funcr newcodernewnskves r_check_in_scopes&ListComprehensionTest._check_in_scopescs<t$::EE*G#&oo/ X__T6%BC<j(&oo/  X__T6%BC  5#G-%' REg- ")B 5 5 7((E)=qD!89+*23MM$q'62231+*s6B#ED-%:E-E3EEEE E+ c6SnS/SQ0nURX5 g)Nzf items = [(lambda i=i: i) for i in range(5)] y = [x() for x in items] y)rr1r&r r's r*test_lambdas_with_iteration_var_as_default@ListComprehensionTest.test_lambdas_with_iteration_var_as_default# ( d,rc6SnS/SQ0nURX5 g)Nzb items = [(lambda: i) for i in range(5)] y = [x() for x in items] r4r8r8r8r8r8r9r:s rtest_lambdas_with_free_var0ListComprehensionTest.test_lambdas_with_free_varr=rc"SS5nURUR/SQ5 URU"5R5U5 g)Nc^^\rSrSrU4Sjr\"S5VV^s/sH mU4SjPM snnr\VVs/sH o""5PM snnrSrU=r $s snnfs snnf)JListComprehensionTest.test_class_scope_free_var_with_class_cell..Cc>[5 T$r)super)r& __class__s rmethodQListComprehensionTest.test_class_scope_free_var_with_class_cell..C.methods  rc>T$rr)isrSListComprehensionTest.test_class_scope_free_var_with_class_cell..C.sarr) __name__ __module__ __qualname____firstlineno__rIranger"r4__static_attributes__ __classcell__).0rMxrHs0p0@rCrDs@ !+0(3(Qi(3E#$ee$A4$s AArYr?)r#r4r$rI)r&rYs r)test_class_scope_free_var_with_class_cell?ListComprehensionTest.test_class_scope_free_var_with_class_cells8 % % o. acjjlA&rc8>SnURUS[/0S9 g)Nz0 res = [super for x in [1]] res)r')r1rG)r&r rHs rtest_references_super+ListComprehensionTest.test_references_supers&  dUUG,<=rc0SnURU[S9 g)Nz4 res = [__class__ for x in [1]] r*r1 NameErrorr&r s rtest_references___class__/ListComprehensionTest.test_references___class__s  d95rc`SnURUSS/0SS/S9 URU[S/S9 g) NzN __class__ = 2 res = [__class__ for x in [1]] r]r6r r )r'r)r r*r)rbrds r!test_references___class___defined7ListComprehensionTest.test_references___class___definedsH  uqclHj3I  K d9gYGrc0SnURU[S9 g)Nz __class__ = 2 class C: res = [__class__ for x in [1]] res = C.res rarbrds r#test_references___class___enclosing9ListComprehensionTest.test_references___class___enclosings  d95rc0SnURU[S9 g)NzO [super for _ in [1]] [__class__ for _ in [1]] rarbrds r*test_super_and_class_cell_in_sibling_comps@ListComprehensionTest.test_super_and_class_cell_in_sibling_compss  d95rc8Sn/SQSS.nURX5 g)Nzu items = [(lambda: i) for i in range(5)] i = 20 y = [x() for x in items] r?)r4rMr9r:s rtest_inner_cell_shadows_outer3ListComprehensionTest.test_inner_cell_shadows_outers#  (b1 d,rc8SnSS/SS.nURX5 g)Nz def f(x): return [lambda: x for x in range(x)], x fns, x = f(2) y = [fn() for fn in fns] r5r6r4rXr9r:s r&test_inner_cell_shadows_outer_no_storeSnSSS//SQ/0nURX5 g)NzX l = [2, 3] y = [[x ** 2 for x in range(x)] for x in l] r4rr5)rr5r8r9r:s r test_nested!ListComprehensionTest.test_nestedgs, !Q+, d,rcdSnS/SQ0nURXSS/S9 URUS/[S9 g) Nzt l = [1, 2, 3] x = 3 y = [x for [x ** x for x in range(x)][x - 1] in l] r4)r7r7r7r r r{r rrbr:s r test_nested_2#ListComprehensionTest.test_nested_2osD   " dXz4JK dG9YGrc6SnS/SQ0nURX5 g)Nzv l = [(1, 2), (3, 4), (5, 6)] y = [x for (x, [x ** x for x in range(x)][x - 1]) in l] r4)r5r7rKr9r:s r test_nested_3#ListComprehensionTest.test_nested_3ys#  " d,rcPSnSSS/S4SS/S4SS/S4/0nURX5 g)Nz items = [([lambda: x for x in range(2)], lambda: x) for x in range(3)] out = [([fn() for fn in fns], fn()) for fns, fn in items] rr5r6r9r:s r test_nested_4#ListComprehensionTest.test_nested_4sB QFA;!Q q!fa[AB d,rc0SnURU[S9 g)Nz4 [x for x in [1]] x rarbrds rtest_nameerror$ListComprehensionTest.test_nameerrors  d95rc4SnSS/0nURX5 g)Nz. y = [__x for __x in [1]] r4r5r9r:s rtest_dunder_name&ListComprehensionTest.test_dunder_names$ * d,rcvSnUR[5 U"5 SSS5 g!,(df  g=f)Nc4SVs/sHoPM nW$s snf)N)r5r)rXs rfGListComprehensionTest.test_unbound_local_after_comprehension..fs! 1Q H s  assertRaisesUnboundLocalErrorr&rs r&test_unbound_local_after_comprehension.fs/A)*Ax0x)1Q4Ax0 00s rrs r'test_unbound_local_inside_comprehension=ListComprehensionTest.test_unbound_local_inside_comprehensions) 1  0 1 C2 1 1rcdSnURUSS0SS0SS/S9 URU[S /S 9 g) Nz a = 1 def f(): func, = [(lambda: b) for b in [a]] return b, func() x = f() rX)r6r5br6r r r(r)r rhrbrds r/test_global_outside_cellvar_inside_plus_freevarEListComprehensionTest.test_global_outside_cellvar_inside_plus_freevarsN   3-S!Hj(5K  M d9gYGrcdSnURUSS0SS0SS/S9 URU[S /S 9 g) Nz a = 1 def f(): (func, inner_b), = [[lambda: b for b in c] + [b] for c in [[a]]] return b, inner_b, func() x = f() rX)r6r6r5rr6r r rr rhrbrds r!test_cell_in_nested_comprehension7ListComprehensionTest.test_cell_in_nested_comprehensionsO   3 "QxX8N  P d9gYGrc4SnURU[S/S9 g)NzA y = 1 [x + y for x in range(2)] r rhrbrds rtest_name_error_in_class_scope4ListComprehensionTest.test_name_error_in_class_scopes"  d9gYGrc<SnSSS/0nURXSS0S/S9 g) NzI y = 2 vals = [(x, y) for x in range(2)] valsrr5r5r5r4r5r rr9r:s rtest_global_in_class_scope0ListComprehensionTest.test_global_in_class_scopes5 FF+, da'Krc<SnSSS/0nURXSS0S/S9 g) Nz class C: y = 2 vals = [(x, y) for x in range(2)] vals = C.vals rrrr4r5r rr9r:s r%test_in_class_scope_inside_function_1;ListComprehensionTest.test_in_class_scope_inside_function_1s5  FF+, da*Nrc6SnSSS/0nURXS/S9 g)Nz y = 1 class C: y = 2 vals = [(x, y) for x in range(2)] vals = C.vals rrrr r{r9r:s r%test_in_class_scope_inside_function_2;ListComprehensionTest.test_in_class_scope_inside_function_2s/ FF+, dZLArcfSnSSS/0nURXSS/S9 SSS /0nURXS /S9 g) Na; y = 1 class C: global y y = 2 # Ensure the listcomp uses the global, not the value in the # class namespace locals()['y'] = 3 vals = [(x, y) for x in range(2)] vals = C.vals rrr6r5r6r r r{rrr r9r:s rtest_in_class_scope_with_global5ListComprehensionTest.test_in_class_scope_with_globalsV  FF+, dXw4GHFF+, dZLArc6SnSSS/0nURXS/S9 g)Na= y = 1 class C: nonlocal y y = 2 # Ensure the listcomp uses the global, not the value in the # class namespace locals()['y'] = 3 vals = [(x, y) for x in range(2)] vals = C.vals rrrr r{r9r:s r!test_in_class_scope_with_nonlocal7ListComprehensionTest.test_in_class_scope_with_nonlocals/  FF+, dZLArc4SnSS/0nURXS/S9 g)NzB items = [a for a in [1] if [a for _ in [0]]] r"r5r r{r9r:s rtest_nested_has_free_var.ListComprehensionTest.test_nested_has_free_vars+ QC. dWI>rcbSnURUSS/0SS/S9 URUS/0SS0S /S 9 g) NzY z = 1 items = [a for a in [1] if [x for x in [1] if z]] r"r5r r r{rzrr rr9rds r,test_nested_free_var_not_bound_in_outer_compBListComprehensionTest.test_nested_free_var_not_bound_in_outer_compsL  dWqcNHj;QR dWbMsAhyQrc2SnURUSS/05 g)Nz] items = [_C for _C in [1] for [0, 1][[x for x in [1] if _C][0]] in [2]] r"r5r9rds rtest_nested_free_var_in_iter2ListComprehensionTest.test_nested_free_var_in_iters!  dWqcN3rc>SnURUSS/4SS/4/05 g)NzM items = [(_C, [x for x in [1] if _C]) for _C in [0, 1]] r"rr5r9rds rtest_nested_free_var_in_expr2ListComprehensionTest.test_nested_free_var_in_exprs/  dW2wQC.A$BCrc4SnURUSS/S.5 g)Nz f = [(z, lambda y: [(x, y, z) for x in [3]]) for z in [1]] (z, func), = f out = func(2) r5)r7r6r5)rzrr9rds rtest_nested_listcomp_in_lambda4ListComprehensionTest.test_nested_listcomp_in_lambda#s"  d!YK$@Arc2SnURUSSS.5 g)Nz (func, c), = [(a, b) for b in [1] for a in [lambda : a]] d = func() assert d is func # must use "a" in this scope e = a if False else None r5)cr0r9rds rtest_lambda_in_iter)ListComprehensionTest.test_lambda_in_iter+s   d!$$78rc2SnURUSS/0S/S9 g)Nz* a = [1 for a in [0]] ar5r r{r9rds r.test_assign_to_comp_iter_var_in_outer_functionDListComprehensionTest.test_assign_to_comp_iter_var_in_outer_function5s(  dS1#J |DrcSnURUS/S.S/S9 URUSS/S.S/S9 URU[S/S 9 g) Nz def b(): [a for b in [1] for _ in []] return b, locals() r, s = b() x = r is b y = list(s.keys()) TrXr4r r{rr r rhrbrds rtest_no_leakage_to_locals/ListComprehensionTest.test_no_leakage_to_locals;s\  d$R$8(L d$cU$;ZLQ d9gYGrc HSnURUSS/SS/SS/SS/SS.5 g)NaJ l = [1, 2] y = 0 items = [locals()["x"] for x in l] items2 = [vars()["x"] for x in l] items3 = [("x" in dir()) for x in l] items4 = [eval("x") for x in l] # x is available, and does not overwrite y [exec("y = x") for x in l] r5r6Tr)r"items2items3items4r4r9rds r!test_iter_var_available_in_locals7ListComprehensionTest.test_iter_var_available_in_localsHs@    Qa&,a&   rcSnURSS9nURUS/S/SS.5 URSS9nURUS/SS/S.[S9 g) Nz value = ["ab"] result = snapshot = None try: result = [{func}(value) for value in value] except: snapshot = value raise lenfuncabr6valueresultsnapshotintrarr1 ValueErrorr&templater s rtest_comp_in_try_except-ListComprehensionTest.test_comp_in_try_except^sn E* dtfQU$VWE* dtfSWRX$Y%/  1rcSnURSS9nURUS/S/S/S.5 URSS9nURUS/SS/S.[S9 g) Nz value = ["ab"] result = snapshot = None try: result = [{func}(value) for value in value] finally: snapshot = value rrrr6rrrarrs rtest_comp_in_try_finally.ListComprehensionTest.test_comp_in_try_finallypsq E* dtfRVQW$XYE* dtfSWRX$Y%/  1rc4SnURUSSS/05 g)Nz value = [1, None] try: [v for v in value].sort() except: pass rr5r9rds r test_exception_in_post_comp_call6ListComprehensionTest.test_exception_in_post_comp_calls$  dWq$i$89rchSnSSKnURUSS0SU0S9 SnURUSS0SU0S9 g)NzM val = "a" in [sys._getframe().f_locals for a in [0]][0] rvalFsysrzK val = [sys._getframe().f_locals["a"] for a in [0]][0] )r)r1)r&r r)s rtest_frame_locals'ListComprehensionTest.test_frame_localssQ   dUENs|D  dUAJE3<@rc^[U[R5(dU$UR[ U4SjUR 55S9$)Nc3F># UHnTRU5v M g7fr)_recursive_replace)rWrr&s r ;ListComprehensionTest._recursive_replace..s#2 0D1D # #A & &0Ds!) co_consts) isinstancetypesCodeTypereplacetupler1)r& maybe_codes` rr.(ListComprehensionTest._recursive_replacesJ*enn55 !!E2 0:0D0D2 - !  rcV[USS5nURU5n[X25 g)Nzexec)compiler.r:)r& code_stringr(cos r_replacing_exec%ListComprehensionTest._replacing_execs' [*f 5  $ $R ( R rcrSnURUS/SS.5 URUS/SS.URS9 g)Nza x = 3 [x for x in (1, 2)] dir() y = [x] r7rvr+)r1r>rds rtest_code_replace'ListComprehensionTest.test_code_replacesD  d1#A$67 d1#A$6$BVBVWrc vSnSRS[U555nSRS[U555nS[[U550[U5Vs0sH nSU3U_M snEnSUS US US US 3 nURXe5 URXeURS 9 gs snf)Ni,z; c32# UH nSUSU3v M g7f)rXz = NrrWrMs rr/GListComprehensionTest.test_code_replace_extended_arg..sH7G!!A3c! 7Gsz, c3,# UH nSU3v M g7f)rXNrrFs rr/rGs@/?!!g/?sr4rXz z [(z) for z6 in (range(300),)] dir() y = [z ] rA)joinrTlistr1r>)r& num_names assignments name_listrMexpectedr s rtest_code_replace_extended_arg4ListComprehensionTest.test_code_replace_extended_args iiHuY7GHH II@uY/?@@ eI&' #(#34#3a1#wz#34  Mk {+   d- d8L8LM5s'B6cSnURUSS/0SS0S9 SnURUSS/S.SS0S /S 9 URUSS/S.SS0S S /S 9 g) NzG [x for x in [1]] y = [x for _ in [1]] r4r7rXrzY x = 2 [x for x in [1]] y = [x for _ in [1]] r6rr rr r r9rds r&test_multiple_comprehension_name_reuse.init_raises8 &4898q899     6166cr[SS9Vs/sHoPM ngs snf![a nUsSnA$SnAff=f)NT) next_raisesrWrYs rr^CListComprehensionTest.test_exception_locations..next_raisesr[r\cr[SS9Vs/sHoPM ngs snf![a nUsSnA$SnAff=f)NT) iter_raisesrWrYs rraCListComprehensionTest.test_exception_locations..iter_raisesr[r\zBrokenIter(init_raises=True)zBrokenIter(next_raises=True)zBrokenIter(iter_raises=True)rr6) r traceback extract_tb __traceback____code__r#linenoco_firstlineno end_linenolinecolno end_colno) r&rVr^rarrNexcrr r=s rtest_exception_locations.ListComprehensionTest.test_exception_locationss      !,-KL +-KL +-KL NDd#f(():):;A>]]  2+<+rBrOrRrorUrV)rHs@rrrbs[-1d4PR#'"EH-- '> 6 H66--LL H -; : ::L --- L--H--6- H HHLO BB" B?R4 D B9E H ,1$1": A  XN" d"+"+rrdoctestscNUR[R"55 U$r)addTestdoctest DocTestSuite)loadertestspatterns r load_testsrys MM'&&() Lr__main__)rtrrdr3unittest test.supportrrqTestCaser__test__ryrPmainrrrrs^ #U pM +H--M +^  "  z MMOr