@@ -27,6 +27,7 @@ cdef extern from "unpack.h":
2727 bint use_list
2828 bint raw
2929 bint has_pairs_hook # call object_hook with k-v pairs
30+ bint strict_map_key
3031 PyObject* object_hook
3132 PyObject* list_hook
3233 PyObject* ext_hook
@@ -56,14 +57,15 @@ cdef extern from "unpack.h":
5657cdef inline init_ctx(unpack_context * ctx,
5758 object object_hook, object object_pairs_hook,
5859 object list_hook, object ext_hook,
59- bint use_list, bint raw,
60+ bint use_list, bint raw, bint strict_map_key,
6061 const char * encoding, const char * unicode_errors,
6162 Py_ssize_t max_str_len, Py_ssize_t max_bin_len,
6263 Py_ssize_t max_array_len, Py_ssize_t max_map_len,
6364 Py_ssize_t max_ext_len):
6465 unpack_init(ctx)
6566 ctx.user.use_list = use_list
6667 ctx.user.raw = raw
68+ ctx.user.strict_map_key = strict_map_key
6769 ctx.user.object_hook = ctx.user.list_hook = < PyObject* > NULL
6870 ctx.user.max_str_len = max_str_len
6971 ctx.user.max_bin_len = max_bin_len
@@ -140,7 +142,7 @@ cdef inline int get_data_from_buffer(object obj,
140142 return 1
141143
142144def unpackb (object packed , object object_hook = None , object list_hook = None ,
143- bint use_list = True , bint raw = True ,
145+ bint use_list = True , bint raw = True , bint strict_map_key = False ,
144146 encoding = None , unicode_errors = None ,
145147 object_pairs_hook = None , ext_hook = ExtType,
146148 Py_ssize_t max_str_len = 1024 * 1024 ,
@@ -180,7 +182,7 @@ def unpackb(object packed, object object_hook=None, object list_hook=None,
180182 get_data_from_buffer(packed, & view, & buf, & buf_len, & new_protocol)
181183 try :
182184 init_ctx(& ctx, object_hook, object_pairs_hook, list_hook, ext_hook,
183- use_list, raw, cenc, cerr,
185+ use_list, raw, strict_map_key, cenc, cerr,
184186 max_str_len, max_bin_len, max_array_len, max_map_len, max_ext_len)
185187 ret = unpack_construct(& ctx, buf, buf_len, & off)
186188 finally :
@@ -236,6 +238,11 @@ cdef class Unpacker(object):
236238
237239 *encoding* option which is deprecated overrides this option.
238240
241+ :param bool strict_map_key:
242+ If true, only str or bytes are accepted for map (dict) keys.
243+ It's False by default for backward-compatibility.
244+ But it will be True from msgpack 1.0.
245+
239246 :param callable object_hook:
240247 When specified, it should be callable.
241248 Unpacker calls it with a dict argument after unpacking msgpack map.
@@ -318,7 +325,7 @@ cdef class Unpacker(object):
318325 self .buf = NULL
319326
320327 def __init__ (self , file_like = None , Py_ssize_t read_size = 0 ,
321- bint use_list = True , bint raw = True ,
328+ bint use_list = True , bint raw = True , bint strict_map_key = False ,
322329 object object_hook = None , object object_pairs_hook = None , object list_hook = None ,
323330 encoding = None , unicode_errors = None , Py_ssize_t max_buffer_size = 0 ,
324331 object ext_hook = ExtType,
@@ -366,7 +373,7 @@ cdef class Unpacker(object):
366373 cerr = unicode_errors
367374
368375 init_ctx(& self .ctx, object_hook, object_pairs_hook, list_hook,
369- ext_hook, use_list, raw, cenc, cerr,
376+ ext_hook, use_list, raw, strict_map_key, cenc, cerr,
370377 max_str_len, max_bin_len, max_array_len,
371378 max_map_len, max_ext_len)
372379
0 commit comments