# mode: run
# tag: dict, pop, builtins
cimport cython
@cython.test_assert_path_exists("//PythonCapiCallNode")
@cython.test_fail_if_path_exists("//AttributeNode")
def dict_pop(dict d, key):
"""
>>> d = { 1: 10, 2: 20 }
>>> dict_pop(d, 1)
(10, {2: 20})
>>> dict_pop(d, 3)
Traceback (most recent call last):
KeyError: 3
>>> dict_pop(d, 2)
(20, {})
"""
return d.pop(key), d
@cython.test_assert_path_exists("//PythonCapiCallNode")
@cython.test_fail_if_path_exists("//AttributeNode")
def dict_pop_default(dict d, key, default):
"""
>>> d = { 1: 10, 2: 20 }
>>> dict_pop_default(d, 1, "default")
(10, {2: 20})
>>> dict_pop_default(d, 3, None)
(None, {2: 20})
>>> dict_pop_default(d, 3, "default")
('default', {2: 20})
>>> dict_pop_default(d, 2, "default")
(20, {})
"""
return d.pop(key, default), d
cdef class MyType:
cdef public int i
def __init__(self, i):
self.i = i
@cython.test_assert_path_exists("//SingleAssignmentNode//PythonCapiCallNode")
@cython.test_fail_if_path_exists("//SingleAssignmentNode//AttributeNode")
def dict_pop_default_typed(dict d, key, default):
"""
>>> d = {1: MyType(2)}
>>> dict_pop_default_typed(d, 1, None)
2
>>> dict_pop_default_typed(d, 3, None)
>>> dict_pop_default_typed(d, 3, "default") # doctest: +ELLIPSIS
Traceback (most recent call last):
TypeError: Cannot convert str to ...MyType
"""
cdef MyType x = d.pop(key, default)
return x.i if x is not None else None