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.2.tar.gz (146.3 kB view details)

Uploaded Source

Built Distributions

msgpack-0.5.2-cp36-cp36m-win_amd64.whl (88.1 kB view details)

Uploaded CPython 3.6m Windows x86-64

msgpack-0.5.2-cp36-cp36m-win32.whl (79.2 kB view details)

Uploaded CPython 3.6m Windows x86

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

Uploaded CPython 3.6m

msgpack-0.5.2-cp36-cp36m-manylinux1_i686.whl (308.4 kB view details)

Uploaded CPython 3.6m

msgpack-0.5.2-cp35-cp35m-win_amd64.whl (87.4 kB view details)

Uploaded CPython 3.5m Windows x86-64

msgpack-0.5.2-cp35-cp35m-win32.whl (78.4 kB view details)

Uploaded CPython 3.5m Windows x86

msgpack-0.5.2-cp35-cp35m-manylinux1_x86_64.whl (321.3 kB view details)

Uploaded CPython 3.5m

msgpack-0.5.2-cp35-cp35m-manylinux1_i686.whl (302.9 kB view details)

Uploaded CPython 3.5m

msgpack-0.5.2-cp27-cp27mu-manylinux1_x86_64.whl (299.7 kB view details)

Uploaded CPython 2.7mu

msgpack-0.5.2-cp27-cp27mu-manylinux1_i686.whl (284.9 kB view details)

Uploaded CPython 2.7mu

msgpack-0.5.2-cp27-cp27m-win_amd64.whl (85.9 kB view details)

Uploaded CPython 2.7m Windows x86-64

msgpack-0.5.2-cp27-cp27m-win32.whl (77.0 kB view details)

Uploaded CPython 2.7m Windows x86

msgpack-0.5.2-cp27-cp27m-manylinux1_x86_64.whl (299.7 kB view details)

Uploaded CPython 2.7m

msgpack-0.5.2-cp27-cp27m-manylinux1_i686.whl (284.9 kB view details)

Uploaded CPython 2.7m

File details

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

File metadata

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

File hashes

Hashes for msgpack-0.5.2.tar.gz
Algorithm Hash digest
SHA256 5d3f3e38cf35f3e26c701f494400787a378c5ae52e3618827db69ad01a6bac08
MD5 b8a08f00bc8abe0567976bad2f81f383
BLAKE2b-256 17991929902c6d0bffce866be5ceadfe6f395041813ad8004a24eb3f82231564

See more details on using hashes here.

File details

Details for the file msgpack-0.5.2-cp36-cp36m-win_amd64.whl.

File metadata

File hashes

Hashes for msgpack-0.5.2-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 18920a908efc3a7374631e4b714bc518ba37d6602174a735c3fa05ddceed801b
MD5 c6d5db6d78a2f543488258d0cd6798fc
BLAKE2b-256 2554d5094168d62bd836b67a0ea64a09fb7db947af9c72be6dd08d543959eb8e

See more details on using hashes here.

File details

Details for the file msgpack-0.5.2-cp36-cp36m-win32.whl.

File metadata

File hashes

Hashes for msgpack-0.5.2-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 75bce26fc0100e253147ed236c5b0a3282c9e4fccdffe2d754373bb4a3e59978
MD5 6f8f0888fbe587808731ad9b27e8cd7e
BLAKE2b-256 b952624b08d921a841a8b308f0bf195918cce2a85a237bbad09eeb6a101c90b6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.2-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 373c3a61cdb91450f5070763d7f116414603edb7f304cdb1f9167a05e495ffc7
MD5 007df7530e52600274321e01d5ff288b
BLAKE2b-256 fd0d027bccffd039356e5513a41a829ed2ba8989df1b34c573065739ded14d47

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.2-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 d8cb5471e99168efbeac0e650a64fe85da4ba586ab12b3b3bb5119f7701ef83b
MD5 2d606f5f4727d930389397b8864d0ef5
BLAKE2b-256 622d2a21e2b86c6502f80e71b1763e94656e07ce4998e942603fef127a5bb52f

See more details on using hashes here.

File details

Details for the file msgpack-0.5.2-cp35-cp35m-win_amd64.whl.

File metadata

File hashes

Hashes for msgpack-0.5.2-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 0dbdcea065e9ab95829ff2dfcc8b8483979b6ac67bcd5cc08df529940132954f
MD5 a26f9b1c0ff97e9250e14e9a53ce6892
BLAKE2b-256 5aced54595491a173607f6fa7c0443d09fe03943c88a81506bad34d3bfa57791

See more details on using hashes here.

File details

Details for the file msgpack-0.5.2-cp35-cp35m-win32.whl.

File metadata

File hashes

Hashes for msgpack-0.5.2-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 ee80dd60278dfb1272126e14db0027721554d112dbe4aa0b5fe36e6c2fa44d4a
MD5 30466477478303aa6404465f21329403
BLAKE2b-256 a96b9ccd03c0e3a72d77fd7b2bbdfd194d5691407a51a729779d02afc2bd6ea2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.2-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 530c35b33f348c00cb53b3687959f38aa29195e2e82d92cf69fb071d64bac1fd
MD5 df8eb436afecf58f00d888435e793f3f
BLAKE2b-256 121c8cdb139ac4a81f7cf2b6b94307d2e802c86425abaa830a867d727fd0c076

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.2-cp35-cp35m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 49592cf7edc8ab4c735b7b4479690d14059307dfa9d6e94f00ab4c3f87eddbe3
MD5 2ac0456f7ff00c0c8b365ad7f9bc069f
BLAKE2b-256 bdfc5cb0dab53e23d2324bc9bd52e6a6061279808017e40bad50d39a9fb5fa9d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.2-cp27-cp27mu-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 b4aed34711c872e6f60bcb3e75168229e674be00bdcdd1c56bddbc7f9faaad03
MD5 aeca5abb2d81b860c80197e40001ac87
BLAKE2b-256 436b6413e68dfb4250b0278fd8c78eeb022f8e19fd73b35ddce732bcb9951472

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.2-cp27-cp27mu-manylinux1_i686.whl
Algorithm Hash digest
SHA256 87fff29ae4e499baaa2f1673f390b480aa9d4c39281dd8d20cecea3ef8ad2be9
MD5 724cee54e2258be91faa1941039b0647
BLAKE2b-256 c0a8eef7e2ead060a34eca06b0c75a89407678f5a44e883ad83963b76a7f7bbf

See more details on using hashes here.

File details

Details for the file msgpack-0.5.2-cp27-cp27m-win_amd64.whl.

File metadata

File hashes

Hashes for msgpack-0.5.2-cp27-cp27m-win_amd64.whl
Algorithm Hash digest
SHA256 f8d97b1a2cc44590a4b1b1ff1fd18a0c58003d3d48053646d064ce7afb11851a
MD5 56c35fdf5ffb50e1f06688f568cccec8
BLAKE2b-256 2cf91fd178466019482e9f485fda4d1922aa94adda4fcb1401cd8662b92b5253

See more details on using hashes here.

File details

Details for the file msgpack-0.5.2-cp27-cp27m-win32.whl.

File metadata

File hashes

Hashes for msgpack-0.5.2-cp27-cp27m-win32.whl
Algorithm Hash digest
SHA256 b98c1d929d610b1e1d71a396714ddc88ce5a403eedd9fa67680f20945e89bb23
MD5 5154160b3781b7228148f7b9f59ea410
BLAKE2b-256 4b8fcf0943e630b0623bf5c169c467d86d10126d7d3fed22d321605417f60e35

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.2-cp27-cp27m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 a53fc4d2db337e30c6bec4a9a06209ac8b22cb069bf0257998c0284029b8d7af
MD5 fe3aec3f5b435e1fcb824f3e14387ecf
BLAKE2b-256 77295c74aca53064f4e015aa2189e4fd3e4df8813d16b838704359028d5225d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.2-cp27-cp27m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 9eea78b0fde77e26d0c7332889a376780496f5529a4e761f7110aa9a01ee5c9c
MD5 eaa95e12a7a54916a144c3977b31e1cc
BLAKE2b-256 f58e88949a24ec32320ffa3c9efc440b66795ba96b2e364a2e5c16b35b648ddc

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