summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorINADA Naoki <inada-n@klab.com>2013-02-03 00:20:00 +0900
committerINADA Naoki <inada-n@klab.com>2013-02-03 00:20:00 +0900
commit22920baae6957e2259a82d0595c2b97fc58fcd02 (patch)
tree5b81cff77ca5492dc2b88c7d3efe0d91df640642
parent0536d1bd0cb5c781b41e8cf7ede66448396dc993 (diff)
downloadmsgpack-python-22920baae6957e2259a82d0595c2b97fc58fcd02.tar.gz
Fix minor bugs and tuning unpacking dict.
-rw-r--r--msgpack/fallback.py25
-rw-r--r--test/test_pack.py2
2 files changed, 17 insertions, 10 deletions
diff --git a/msgpack/fallback.py b/msgpack/fallback.py
index ac6dbf9..c10c6ac 100644
--- a/msgpack/fallback.py
+++ b/msgpack/fallback.py
@@ -360,16 +360,19 @@ class Unpacker(object):
self._fb_unpack(EX_SKIP, write_bytes)
self._fb_unpack(EX_SKIP, write_bytes)
return
- ret = []
- for i in xrange(n):
- ret.append((self._fb_unpack(EX_CONSTRUCT, write_bytes),
- self._fb_unpack(EX_CONSTRUCT, write_bytes)))
if self.object_pairs_hook is not None:
- ret = self.object_pairs_hook(ret)
+ ret = self.object_pairs_hook(
+ (self._fb_unpack(EX_CONSTRUCT, write_bytes),
+ self._fb_unpack(EX_CONSTRUCT, write_bytes))
+ for _ in xrange(n)
+ )
else:
- ret = dict(ret)
- if self.object_hook is not None:
- ret = self.object_hook(ret)
+ ret = {}
+ for _ in xrange(n):
+ key = self._fb_unpack(EX_CONSTRUCT, write_bytes)
+ ret[key] = self._fb_unpack(EX_CONSTRUCT, write_bytes)
+ if self.object_hook is not None:
+ ret = self.object_hook(ret)
return ret
if execute == EX_SKIP:
return
@@ -421,7 +424,7 @@ class Packer(object):
raise TypeError("default must be callable")
self._default = default
- def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT):
+ def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT, isinstance=isinstance):
if nest_limit < 0:
raise PackValueError("recursion limit exceeded")
if obj is None:
@@ -454,6 +457,10 @@ class Packer(object):
raise PackValueError("Integer value out of range")
if isinstance(obj, (Unicode, bytes)):
if isinstance(obj, Unicode):
+ if self.encoding is None:
+ raise TypeError(
+ "Can't encode unicode string: "
+ "no encoding is specified")
obj = obj.encode(self.encoding, self.unicode_errors)
n = len(obj)
if n <= 0x1f:
diff --git a/test/test_pack.py b/test/test_pack.py
index 8f4117c..3225f41 100644
--- a/test/test_pack.py
+++ b/test/test_pack.py
@@ -151,7 +151,7 @@ def test_odict():
od = odict(seq)
assert unpackb(packb(od), use_list=1) == dict(seq)
def pair_hook(seq):
- return seq
+ return list(seq)
assert unpackb(packb(od), object_pairs_hook=pair_hook, use_list=1) == seq