8000 Fix minor bugs and tuning unpacking dict. · peter80/msgpack-python@22920ba · GitHub
[go: up one dir, main page]

Skip to content

Commit 22920ba

Browse files
committed
Fix minor bugs and tuning unpacking dict.
1 parent 0536d1b commit 22920ba

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

msgpack/fallback.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -360,16 +360,19 @@ def _fb_unpack(self, execute=EX_CONSTRUCT, write_bytes=None):
360360
self._fb_unpack(EX_SKIP, write_bytes)
361361
self._fb_unpack(EX_SKIP, write_bytes)
362362
return
363-
ret = []
364-
for i in xrange(n):
365-
ret.append((self._fb_unpack(EX_CONSTRUCT, write_bytes),
366-
self._fb_unpack(EX_CONSTRUCT, write_bytes)))
367363
if self.object_pairs_hook is not None:
368-
ret = self.object_pairs_hook(ret)
364+
ret = self.object_pairs_hook(
365+
(self._fb_unpack(EX_CONSTRUCT, write_bytes),
366+
self._fb_unpack(EX_CONSTRUCT, write_bytes))
367+
for _ in xrange(n)
368+
)
369369
else:
370-
ret = dict(ret)
371-
if self.object_hook is not None:
372-
ret = self.object_hook(ret)
370+
ret = {}
371+
for _ in xrange(n):
372+
key = self._fb_unpack(EX_CONSTRUCT, write_bytes)
373+
ret[key] = self._fb_unpack(EX_CONSTRUCT, write_bytes)
374+
if self.object_hook is not None:
375+
ret = self.object_hook(ret)
373376
return ret
374377
if execute == EX_SKIP:
375378
return
@@ -421,7 +424,7 @@ def __init__(self, default=None, encoding='utf-8', unicode_errors='strict',
421424
raise TypeError("default must be callable")
422425
self._default = default
423426

424-
def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT):
427+
def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT, isinstance=isinstance):
425428
if nest_limit < 0:
426429
raise PackValueError("recursion limit exceeded")
427430
if obj is None:
@@ -454,6 +457,10 @@ def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT):
454457
raise PackValueError("Integer value out of range")
455458
if isinstance(obj, (Unicode, bytes)):
456459
if isinstance(obj, Unicode):
460+
if self.encoding is None:
461+
raise TypeError(
462+
"Can't encode unicode string: "
463+
"no encoding is specified")
457464
obj = obj.encode(self.encoding, self.unicode_errors)
458465
n = len(obj)
459466
if n <= 0x1f:

test/test_pack.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ def test_odict():
151151
od = odict(seq)
152152
assert unpackb(packb(od), use_list=1) == dict(seq)
153153
def pair_hook(seq):
154-
return seq
154+
return list(seq)
155155
assert unpackb(packb(od), object_pairs_hook=pair_hook, use_list=1) == seq
156156

157157

0 commit comments

Comments
 (0)
0