@@ -435,21 +435,34 @@ def test_dict_mergefromseq2(self):
435
435
def test_dict_pop (self ):
436
436
# Test PyDict_Pop()
437
437
dict_pop = _testcapi .dict_pop
438
+ dict_pop_null = _testcapi .dict_pop_null
438
439
439
- # key present
440
+ # key present, get removed value
440
441
mydict = {"key" : "value" , "key2" : "value2" }
441
442
self .assertEqual (dict_pop (mydict , "key" ), (1 , "value" ))
442
443
self .assertEqual (mydict , {"key2" : "value2" })
443
444
self .assertEqual (dict_pop (mydict , "key2" ), (1 , "value2" ))
444
445
self .assertEqual (mydict , {})
445
446
446
- # key missing; empty dict has a fast path
447
+ # key present, ignore removed value
448
+ mydict = {"key" : "value" , "key2" : "value2" }
449
+ self .assertEqual (dict_pop_null (mydict , "key" ), 1 )
450
+ self .assertEqual (mydict , {"key2" : "value2" })
451
+ self .assertEqual (dict_pop_null (mydict , "key2" ), 1 )
452
+ self .assertEqual (mydict , {})
453
+
454
+ # key missing, expect removed value; empty dict has a fast path
447
455
self .assertEqual (dict_pop ({}, "key" ), (0 , NULL ))
448
456
self .assertEqual (dict_pop ({"a" : 1 }, "key" ), (0 , NULL ))
449
457
458
+ # key missing, ignored removed value; empty dict has a fast path
459
+ self .assertEqual (dict_pop_null ({}, "key" ), 0 )
460
+ self .assertEqual (dict_pop_null ({"a" : 1 }, "key" ), 0 )
461
+
450
462
# dict error
451
- not_dict = "string"
463
+ not_dict = UserDict ({ 1 : 2 })
452
464
self .assertRaises (SystemError , dict_pop , not_dict , "key" )
465
+ self .assertRaises (SystemError , dict_pop_null , not_dict , "key" )
453
466
454
467
# key error; don't hash key if dict is empty
455
468
not_hashable_key = ["list" ]
@@ -459,7 +472,29 @@ def test_dict_pop(self):
459
472
dict_pop ({}, NULL ) # key is not checked if dict is empty
460
473
461
474
# CRASHES dict_pop(NULL, "key")
462
- # CRASHES dict_pop({"a": 1}, NULL, default)
475
+ # CRASHES dict_pop({"a": 1}, NULL)
476
+
477
+ def test_dict_popstring (self ):
478
+ # Test PyDict_PopString()
479
+ dict_popstring = _testcapi .dict_popstring
480
+
481
+ # key present
482
+ mydict = {"key" : "value" , "key2" : "value2" }
483
+ self .assertEqual (dict_popstring (mydict , "key" ), (1 , "value" ))
484
+ self .assertEqual (mydict , {"key2" : "value2" })
485
+ self .assertEqual (dict_popstring (mydict , "key2" ), (1 , "value2" ))
486
+ self .assertEqual (mydict , {})
487
+
488
+ # key missing; empty dict has a fast path
489
+ self .assertEqual (dict_popstring ({}, "key" ), (0 , NULL ))
490
+ self .assertEqual (dict_popstring ({"a" : 1 }, "key" ), (0 , NULL ))
491
+
492
+ # dict error
493
+ not_dict = UserDict ({1 : 2 })
494
+ self .assertRaises (SystemError , dict_popstring , not_dict , "key" )
495
+
496
+ # CRASHES dict_popstring(NULL, "key")
497
+ # CRASHES dict_popstring({"a": 1}, NULL)
463
498
464
499
465
500
if __name__ == "__main__" :
0 commit comments