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