@@ -2464,6 +2464,19 @@ def test_list_isinstance(self):
2464
2464
a = self .list ()
2465
2465
self .assertIsInstance (a , collections .abc .MutableSequence )
2466
2466
2467
+ # MutableSequence also has __iter__, but we can iterate over
2468
+ # ListProxy using __getitem__ instead. Adding __iter__ to ListProxy
2469
+ # would change the behavior of a list modified during iteration.
2470
+ mutable_sequence_methods = (
2471
+ '__contains__' , '__delitem__' , '__getitem__' , '__iadd__' ,
2472
+ '__len__' , '__reversed__' , '__setitem__' , 'append' ,
2473
+ 'clear' , 'count' , 'extend' , 'index' , 'insert' , 'pop' , 'remove' ,
2474
+ 'reverse' ,
2475
+ )
2476
+ for name in mutable_sequence_methods :
2477
+ with self .subTest (name = name ):
2478
+ self .assertTrue (callable (getattr (a , name )))
2479
+
2467
2480
def test_list_iter (self ):
2468
2481
a = self .list (list (range (10 )))
2469
2482
it = iter (a )
@@ -2508,6 +2521,15 @@ def test_dict_isinstance(self):
2508
2521
a = self .dict ()
2509
2522
self .assertIsInstance (a , collections .abc .MutableMapping )
2510
2523
2524
+ mutable_mapping_methods = (
2525
+ '__contains__' , '__delitem__' , '__eq__' , '__getitem__' , '__iter__' ,
2526
+ '__len__' , '__ne__' , '__setitem__' , 'clear' , 'get' , 'items' ,
2527
+ 'keys' , 'pop' , 'popitem' , 'setdefault' , 'update' , 'values' ,
2528
+ )
2529
+ for name in mutable_mapping_methods :
2530
+ with self .subTest (name = name ):
2531
+ self .assertTrue (callable (getattr (a , name )))
2532
+
2511
2533
def test_dict_iter (self ):
2512
2534
d = self .dict ()
2513
2535
indices = list (range (65 , 70 ))
0 commit comments