@@ -435,21 +435,34 @@ def test_dict_mergefromseq2(self):
435435 def test_dict_pop (self ):
436436 # Test PyDict_Pop()
437437 dict_pop = _testcapi .dict_pop
438+ dict_pop_null = _testcapi .dict_pop_null
438439
439- # key present
440+ # key present, get removed value
440441 mydict = {"key" : "value" , "key2" : "value2" }
441442 self .assertEqual (dict_pop (mydict , "key" ), (1 , "value" ))
442443 self .assertEqual (mydict , {"key2" : "value2" })
443444 self .assertEqual (dict_pop (mydict , "key2" ), (1 , "value2" ))
444445 self .assertEqual (mydict , {})
445446
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
447455 self .assertEqual (dict_pop ({}, "key" ), (0 , NULL ))
448456 self .assertEqual (dict_pop ({"a" : 1 }, "key" ), (0 , NULL ))
449457
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+
450462 # dict error
451- not_dict = "string"
463+ not_dict = UserDict ({ 1 : 2 })
452464 self .assertRaises (SystemError , dict_pop , not_dict , "key" )
465+ self .assertRaises (SystemError , dict_pop_null , not_dict , "key" )
453466
454467 # key error; don't hash key if dict is empty
455468 not_hashable_key = ["list" ]
@@ -459,7 +472,29 @@ def test_dict_pop(self):
459472 dict_pop ({}, NULL ) # key is not checked if dict is empty
460473
461474 # 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)
463498
464499
465500if __name__ == "__main__" :
0 commit comments