Skip to main content

MessagePack (de)serializer.

Project description

Build Status Documentation Status

What’s this

MessagePack is an efficient binary serialization format. It lets you exchange data among multiple languages like JSON. But it’s faster and smaller. This package provides CPython bindings for reading and writing MessagePack data.

Very important notes for existing users

PyPI package name

TL;DR: When upgrading from msgpack-0.4 or earlier, don’t do pip install -U msgpack-python. Do pip uninstall msgpack-python; pip install msgpack instead.

Package name on PyPI was changed to msgpack from 0.5. I upload transitional package (msgpack-python 0.5 which depending on msgpack) for smooth transition from msgpack-python to msgpack.

Sadly, this doesn’t work for upgrade install. After pip install -U msgpack-python, msgpack is removed and import msgpack fail.

Deprecating encoding option

encoding and unicode_errors options are deprecated.

In case of packer, use UTF-8 always. Storing other than UTF-8 is not recommended.

For backward compatibility, you can use use_bin_type=False and pack bytes object into msgpack raw type.

In case of unpacker, there is new raw option. It is True by default for backward compatibility, but it is changed to False in near future. You can use raw=False instead of encoding='utf-8'.

Planned backward incompatible changes

When msgpack 1.0, I planning these breaking changes:

  • packer and unpacker: Remove encoding and unicode_errors option.

  • packer: Change default of use_bin_type option from False to True.

  • unpacker: Change default of raw option from True to False.

  • unpacker: Reduce all max_xxx_len options for typical usage.

  • unpacker: Remove write_bytes option from all methods.

To avoid these breaking changes breaks your application, please:

  • Don’t use deprecated options.

  • Pass use_bin_type and raw options explicitly.

  • If your application handle large (>1MB) data, specify max_xxx_len options too.

Install

$ pip install msgpack

PyPy

msgpack provides a pure Python implementation. PyPy can use this.

Windows

When you can’t use a binary distribution, you need to install Visual Studio or Windows SDK on Windows. Without extension, using pure Python implementation on CPython runs slowly.

For Python 2.7, Microsoft Visual C++ Compiler for Python 2.7 is recommended solution.

For Python 3.5, Microsoft Visual Studio 2015 Community Edition or Express Edition can be used to build extension module.

How to use

One-shot pack & unpack

Use packb for packing and unpackb for unpacking. msgpack provides dumps and loads as an alias for compatibility with json and pickle.

pack and dump packs to a file-like object. unpack and load unpacks from a file-like object.

>>> import msgpack
>>> msgpack.packb([1, 2, 3], use_bin_type=True)
'\x93\x01\x02\x03'
>>> msgpack.unpackb(_, raw=False)
[1, 2, 3]

unpack unpacks msgpack’s array to Python’s list, but can also unpack to tuple:

>>> msgpack.unpackb(b'\x93\x01\x02\x03', use_list=False, raw=False)
(1, 2, 3)

You should always specify the use_list keyword argument for backward compatibility. See performance issues relating to use_list option below.

Read the docstring for other options.

Streaming unpacking

Unpacker is a “streaming unpacker”. It unpacks multiple objects from one stream (or from bytes provided through its feed method).

import msgpack
from io import BytesIO

buf = BytesIO()
for i in range(100):
   buf.write(msgpack.packb(range(i), use_bin_type=True))

buf.seek(0)

unpacker = msgpack.Unpacker(buf, raw=False)
for unpacked in unpacker:
    print(unpacked)

Packing/unpacking of custom data type

It is also possible to pack/unpack custom data types. Here is an example for datetime.datetime.

import datetime
import msgpack

useful_dict = {
    "id": 1,
    "created": datetime.datetime.now(),
}

def decode_datetime(obj):
    if b'__datetime__' in obj:
        obj = datetime.datetime.strptime(obj["as_str"], "%Y%m%dT%H:%M:%S.%f")
    return obj

def encode_datetime(obj):
    if isinstance(obj, datetime.datetime):
        return {'__datetime__': True, 'as_str': obj.strftime("%Y%m%dT%H:%M:%S.%f")}
    return obj


packed_dict = msgpack.packb(useful_dict, default=encode_datetime, use_bin_type=True)
this_dict_again = msgpack.unpackb(packed_dict, object_hook=decode_datetime, raw=False)

Unpacker’s object_hook callback receives a dict; the object_pairs_hook callback may instead be used to receive a list of key-value pairs.

Extended types

It is also possible to pack/unpack custom data types using the ext type.

>>> import msgpack
>>> import array
>>> def default(obj):
...     if isinstance(obj, array.array) and obj.typecode == 'd':
...         return msgpack.ExtType(42, obj.tostring())
...     raise TypeError("Unknown type: %r" % (obj,))
...
>>> def ext_hook(code, data):
...     if code == 42:
...         a = array.array('d')
...         a.fromstring(data)
...         return a
...     return ExtType(code, data)
...
>>> data = array.array('d', [1.2, 3.4])
>>> packed = msgpack.packb(data, default=default, use_bin_type=True)
>>> unpacked = msgpack.unpackb(packed, ext_hook=ext_hook, raw=False)
>>> data == unpacked
True

Advanced unpacking control

As an alternative to iteration, Unpacker objects provide unpack, skip, read_array_header and read_map_header methods. The former two read an entire message from the stream, respectively de-serialising and returning the result, or ignoring it. The latter two methods return the number of elements in the upcoming container, so that each element in an array, or key-value pair in a map, can be unpacked or skipped individually.

Each of these methods may optionally write the packed data it reads to a callback function:

from io import BytesIO

def distribute(unpacker, get_worker):
    nelems = unpacker.read_map_header()
    for i in range(nelems):
        # Select a worker for the given key
        key = unpacker.unpack()
        worker = get_worker(key)

        # Send the value as a packed message to worker
        bytestream = BytesIO()
        unpacker.skip(bytestream.write)
        worker.send(bytestream.getvalue())

Notes

string and binary type

Early versions of msgpack didn’t distinguish string and binary types (like Python 1). The type for representing both string and binary types was named raw.

For backward compatibility reasons, msgpack-python will still default all strings to byte strings, unless you specify the use_bin_type=True option in the packer. If you do so, it will use a non-standard type called bin to serialize byte arrays, and raw becomes to mean str. If you want to distinguish bin and raw in the unpacker, specify raw=False.

Note that Python 2 defaults to byte-arrays over Unicode strings:

>>> import msgpack
>>> msgpack.unpackb(msgpack.packb([b'spam', u'eggs']))
['spam', 'eggs']
>>> msgpack.unpackb(msgpack.packb([b'spam', u'eggs'], use_bin_type=True),
                    raw=False)
['spam', u'eggs']

This is the same code in Python 3 (same behaviour, but Python 3 has a different default):

>>> import msgpack
>>> msgpack.unpackb(msgpack.packb([b'spam', u'eggs']))
[b'spam', b'eggs']
>>> msgpack.unpackb(msgpack.packb([b'spam', u'eggs'], use_bin_type=True),
                    raw=False)
[b'spam', 'eggs']

ext type

To use the ext type, pass msgpack.ExtType object to packer.

>>> import msgpack
>>> packed = msgpack.packb(msgpack.ExtType(42, b'xyzzy'))
>>> msgpack.unpackb(packed)
ExtType(code=42, data='xyzzy')

You can use it with default and ext_hook. See below.

Note about performance

GC

CPython’s GC starts when growing allocated object. This means unpacking may cause useless GC. You can use gc.disable() when unpacking large message.

use_list option

List is the default sequence type of Python. But tuple is lighter than list. You can use use_list=False while unpacking when performance is important.

Python’s dict can’t use list as key and MessagePack allows array for key of mapping. use_list=False allows unpacking such message. Another way to unpacking such object is using object_pairs_hook.

Development

Test

MessagePack uses pytest for testing. Run test with following command:

$ make test

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

msgpack-0.5.3.tar.gz (146.3 kB view details)

Uploaded Source

Built Distributions

msgpack-0.5.3-cp36-cp36m-manylinux1_x86_64.whl (327.1 kB view details)

Uploaded CPython 3.6m

msgpack-0.5.3-cp36-cp36m-manylinux1_i686.whl (308.2 kB view details)

Uploaded CPython 3.6m

msgpack-0.5.3-cp35-cp35m-manylinux1_x86_64.whl (321.1 kB view details)

Uploaded CPython 3.5m

msgpack-0.5.3-cp35-cp35m-manylinux1_i686.whl (301.9 kB view details)

Uploaded CPython 3.5m

msgpack-0.5.3-cp27-cp27mu-manylinux1_x86_64.whl (299.5 kB view details)

Uploaded CPython 2.7mu

msgpack-0.5.3-cp27-cp27mu-manylinux1_i686.whl (284.1 kB view details)

Uploaded CPython 2.7mu

msgpack-0.5.3-cp27-cp27m-manylinux1_x86_64.whl (299.5 kB view details)

Uploaded CPython 2.7m

msgpack-0.5.3-cp27-cp27m-manylinux1_i686.whl (284.1 kB view details)

Uploaded CPython 2.7m

File details

Details for the file msgpack-0.5.3.tar.gz.

File metadata

  • Download URL: msgpack-0.5.3.tar.gz
  • Upload date:
  • Size: 146.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for msgpack-0.5.3.tar.gz
Algorithm Hash digest
SHA256 d9784ed5f3ebaadb7dabc9e8fe2a4c080ba26de21737977a21e7ee67eae07db8
MD5 a5dd71e2c8f7a97ec80f5c892dce966e
BLAKE2b-256 5d5695150b5a6cbb7f12687cf0be7c1f2d361f89b6ebfda0aa3d818fc82d9a94

See more details on using hashes here.

File details

Details for the file msgpack-0.5.3-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for msgpack-0.5.3-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 68c68bd78871e0e94cf7bd79928ad83bf572b5e050b56c3d6ca94c78d4f4ae2c
MD5 5b9aea8e75936ad710ca6b30e8a6e96d
BLAKE2b-256 4405100351aa97d39f896e18faeac65faee4cfcf66b585c2dfac91242c40e8ba

See more details on using hashes here.

File details

Details for the file msgpack-0.5.3-cp36-cp36m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for msgpack-0.5.3-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 2c8c29e7e4764c344d89b83c826c9f1549fbd19a683a8d957e62aa0ca400d22c
MD5 3ec38b8e7ac43e1d36b34144af92226b
BLAKE2b-256 b4cd827e0c84bd4c7dc1b718437b6d3cc93b753636d37eb32ca6fc3337ff6b2c

See more details on using hashes here.

File details

Details for the file msgpack-0.5.3-cp35-cp35m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for msgpack-0.5.3-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 7cfde8940963c89dc522075ed99d0941d62a730a6fabfaaeef40c6bb3ed18edf
MD5 6c86013f371e0c18ad86c81bc05ca01d
BLAKE2b-256 cf18170ad4123403599c30cc4a5379e2bf27c3c12c9b7093a95f6200aa3c2326

See more details on using hashes here.

File details

Details for the file msgpack-0.5.3-cp35-cp35m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for msgpack-0.5.3-cp35-cp35m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 b907f8f090e8b95aa87d72ca01bcc3fb7b5efe1a07e10b349c97a5cbb5eb1dca
MD5 e8f340ade8e99d3c8129d52cd9564856
BLAKE2b-256 867ff776a7d82d4e164a856b4af54bb64509ea5c8661b53e43e442a779f7e74a

See more details on using hashes here.

File details

Details for the file msgpack-0.5.3-cp27-cp27mu-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for msgpack-0.5.3-cp27-cp27mu-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 a7e9e1cf28516fadebe26302da845886462f0b1b19746aefb1325c251647109c
MD5 609ab4f48ab18325c0ea94d0987946db
BLAKE2b-256 41a51e44b821c04f2724b89289fa42a42ad8a600dd9ed7a65015141aa7639747

See more details on using hashes here.

File details

Details for the file msgpack-0.5.3-cp27-cp27mu-manylinux1_i686.whl.

File metadata

File hashes

Hashes for msgpack-0.5.3-cp27-cp27mu-manylinux1_i686.whl
Algorithm Hash digest
SHA256 f7e6df58d2c251d4cdf21b797b0b6bf1c61822d3d40154e5196a31bc141cd9f4
MD5 437bd8663fecebfc5b55d2a17d45cb5e
BLAKE2b-256 b56edf4696c9c1628338afddc977d16dcad852fc74a827cb733ce5ec6790b911

See more details on using hashes here.

File details

Details for the file msgpack-0.5.3-cp27-cp27m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for msgpack-0.5.3-cp27-cp27m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 87304fef74715bc76e6ad84accf34503aa57486a3397ac5178bb6b825e1dd3da
MD5 7d01e6b0ce3c503090619d0bf38da9a8
BLAKE2b-256 5cbd3dc9df15693f5bf115290f65566d7441dc4fa6ed89a7d6d36fe21af73cd4

See more details on using hashes here.

File details

Details for the file msgpack-0.5.3-cp27-cp27m-manylinux1_i686.whl.

File metadata

File hashes

Hashes for msgpack-0.5.3-cp27-cp27m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 a9e512de7bfb2706255a073ce578b3c1ebb5c30f7bfffd664a8fccb04c903f9d
MD5 80517feb3d22f0c390d52b084917f1a3
BLAKE2b-256 c0fd907eba2c7dda1b301f5b4e6fcd6f3744c24ddd0c53bed88fb1e5982800b7

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page