@@ -268,6 +268,84 @@ def loop():
268
268
#This should not raise
269
269
loop ()
270
270
271
+
272
+ class ModifyTest (unittest .TestCase ):
273
+ sequences = [
274
+ range (0 ),
275
+ range (20 ),
276
+ [1 , 2 , 3 ],
277
+ (2 ,),
278
+ set ((13 , 48 , 211 )),
279
+ frozenset ((15 , 8 , 6 )),
280
+ dict ([(1 , 2 ), (3 , 4 )]),
281
+ ]
282
+
283
+ non_sequences = [
284
+ None ,
285
+ 42 ,
286
+ 3.0 ,
287
+ 2j ,
288
+ ]
289
+
290
+ def modify_f_locals (self , g , local , new_iter ):
291
+ g .gi_frame .f_locals [local ] = new_iter
292
+ return g
293
+
294
+ def new_gen_from_gi_code (self , g , new_iter ):
295
+ generator_func = types .FunctionType (g .gi_code , {})
296
+ return generator_func (new_iter )
297
+
298
+ def test_modify_genexpr (self ):
299
+ def genexpr ():
300
+ return (x for x in range (10 ))
301
+
302
+ def get_genexpr_f_locals (self , new_iter ):
303
+ return self .modify_f_locals (genexpr (), '.0' , new_iter )
304
+
305
+ def get_genexpr_gi_code (self , new_iter ):
306
+ return self .new_gen_from_gi_code (genexpr (), new_iter )
307
+
308
+ err_msg_pattern_genexpr = "'%s' object is not an iterator"
309
+
310
+ for get_genexpr in [get_genexpr_f_locals , get_genexpr_gi_code ]:
311
+ for seq in self .sequences :
312
+ err_msg_genexpr = err_msg_pattern_genexpr % type (seq ).__name__
313
+ with self .assertRaisesRegex (TypeError , err_msg_genexpr ):
314
+ list (get_genexpr (self , seq ))
315
+ self .assertListEqual (list (get_genexpr (self , iter (seq ))),
316
+ list (seq ))
317
+ for obj in self .non_sequences :
318
+ err_msg_genexpr = err_msg_pattern_genexpr % type (obj ).__name__
319
+ with self
B41A
.assertRaisesRegex (TypeError , err_msg_genexpr ):
320
+ list (get_genexpr (self , obj ))
321
+
322
+ def test_modify_genfunc (self ):
323
+ def genfunc ():
324
+ def gen (it ):
325
+ for x in it :
326
+ yield x
327
+ return gen (range (10 ))
328
+
329
+ def get_genfunc_f_locals (self , new_iter ):
330
+ return self .modify_f_locals (genfunc (), 'it' , new_iter )
331
+
332
+ def get_genfunc_gi_code (self , new_iter ):
333
+ return self .new_gen_from_gi_code (genfunc (), new_iter )
334
+
335
+ err_msg_pattern_fn_call = "'%s' object is not iterable"
336
+
337
+ for get_genfunc in [get_genfunc_f_locals , get_genfunc_gi_code ]:
338
+ for seq in self .sequences :
339
+ self .assertListEqual (list (get_genfunc (self , seq )),
340
+ list (seq ))
341
+ self .assertListEqual (list (get_genfunc (self , iter (seq ))),
342
+ list (seq ))
343
+ for obj in self .non_sequences :
344
+ err_msg_fn_call = err_msg_pattern_fn_call % type (obj ).__name__
345
+ with self .assertRaisesRegex (TypeError , err_msg_fn_call ):
346
+ list (get_genfunc (self , obj ))
347
+
348
+
271
349
class ExceptionTest (unittest .TestCase ):
272
350
# Tests for the issue #23353: check that the currently handled exception
273
351
# is correctly saved/restored in PyEval_EvalFrameEx().
0 commit comments