@@ -268,6 +268,79 @@ def loop():
268
268
#This should not raise
269
269
loop ()
270
270
271
+
272
+ class ModifyUnderlyingIterableTest (unittest .TestCase ):
273
+ iterables = [
274
+ range (0 ),
275
+ range (20 ),
276
+ [1 , 2 , 3 ],
277
+ (2 ,),
278
+ {13 , 48 , 211 },
279
+ frozenset ((15 , 8 , 6 )),
280
+ {1 : 2 , 3 : 4 },
281
+ ]
282
+
283
+ non_iterables = [
284
+ None ,
285
+ 42 ,
286
+ 3.0 ,
287
+ 2j ,
288
+ ]
289
+
290
+ def genexpr (self ):
291
+ return (x for x in range (10 ))
292
+
293
+ def genfunc (self ):
294
+ def gen (it ):
295
+ for x in it :
296
+ yield x
297
+ return gen (range (10 ))
298
+
299
+ def process_tests (self , get_generator ):
300
+ for obj in self .iterables :
301
+ g_obj = get_generator (obj )
302
+ with self .subTest (g_obj = g_obj , obj = obj ):
303
+ self .assertListEqual (list (g_obj ), list (obj ))
304
+
305
+ g_iter = get_generator (iter (obj ))
306
+ with self .subTest (g_iter = g_iter , obj = obj ):
307
+ self .assertListEqual (list (g_iter ), list (obj ))
308
+
309
+ err_regex = "'.*' object is not iterable"
310
+ for obj in self .non_iterables :
311
+ g_obj = get_generator (obj )
312
+ with self .subTest (g_obj = g_obj ):
313
+ self .assertRaisesRegex (TypeError , err_regex , list , g_obj )
314
+
315
+ def test_modify_f_locals (self ):
316
+ def modify_f_locals (g , local , obj ):
317
+ g .gi_frame .f_locals [local ] = obj
318
+ return g
319
+
320
+ def get_generator_genexpr (obj ):
321
+ return modify_f_locals (self .genexpr (), '.0' , obj )
322
+
323
+ def get_generator_genfunc (obj ):
324
+ return modify_f_locals (self .genfunc (), 'it' , obj )
325
+
326
+ self .process_tests (get_generator_genexpr )
327
+ self .process_tests (get_generator_genfunc )
328
+
329
+ def test_new_gen_from_gi_code (self ):
330
+ def new_gen_from_gi_code (g , obj ):
331
+ generator_func = types .FunctionType (g .gi_code , {})
332
+ return generator_func (obj )
333
+
334
+ def get_generator_genexpr (obj ):
335
+ return new_gen_from_gi_code (self .genexpr (), obj )
336
+
337
+ def get_generator_genfunc (obj ):
338
+ return new_gen_from_gi_code (self .genfunc (), obj )
339
+
340
+ self .process_tests (get_generator_genexpr )
341
+ self .process_tests (get_generator_genfunc )
342
+
343
+
271
344
class ExceptionTest (unittest .TestCase ):
272
345
# Tests for the issue #23353: check that the currently handled exception
273
346
# is correctly saved/restored in PyEval_EvalFrameEx().
0 commit comments