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.

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(_)
[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)
(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)
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)

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)
>>> unpacked = msgpack.unpackb(packed, ext_hook=ext_hook)
>>> 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 encoding=’utf-8’.

In future version, default value of ``use_bin_type`` will be changed to ``False``. To avoid this change will break your code, you must specify it explicitly even when you want to use old format.

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),
                    encoding='utf-8')
['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),
                    encoding='utf-8')
[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:

$ py.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.0.tar.gz (142.1 kB view details)

Uploaded Source

Built Distributions

msgpack-0.5.0-cp36-cp36m-win_amd64.whl (84.9 kB view details)

Uploaded CPython 3.6m Windows x86-64

msgpack-0.5.0-cp36-cp36m-win32.whl (76.0 kB view details)

Uploaded CPython 3.6m Windows x86

msgpack-0.5.0-cp36-cp36m-manylinux1_x86_64.whl (322.3 kB view details)

Uploaded CPython 3.6m

msgpack-0.5.0-cp36-cp36m-manylinux1_i686.whl (302.5 kB view details)

Uploaded CPython 3.6m

msgpack-0.5.0-cp35-cp35m-manylinux1_x86_64.whl (316.2 kB view details)

Uploaded CPython 3.5m

msgpack-0.5.0-cp35-cp35m-manylinux1_i686.whl (296.9 kB view details)

Uploaded CPython 3.5m

msgpack-0.5.0-cp27-cp27mu-manylinux1_x86_64.whl (294.6 kB view details)

Uploaded CPython 2.7mu

msgpack-0.5.0-cp27-cp27mu-manylinux1_i686.whl (278.9 kB view details)

Uploaded CPython 2.7mu

msgpack-0.5.0-cp27-cp27m-manylinux1_x86_64.whl (294.6 kB view details)

Uploaded CPython 2.7m

msgpack-0.5.0-cp27-cp27m-manylinux1_i686.whl (278.9 kB view details)

Uploaded CPython 2.7m

File details

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

File metadata

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

File hashes

Hashes for msgpack-0.5.0.tar.gz
Algorithm Hash digest
SHA256 9ed78ef17937222b0467566487bab1ca1bb28158f66c6528ff3d5aced93ff49d
MD5 6d1df33fe19dcde7bde62f808f9c4488
BLAKE2b-256 c82c7ed8a002ebf55e6b814b4b643d664f0a16aa7c0fa94987f9848b0b0d28f4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.0-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 c165c44abc98ac8ccf921a5f0506b60180a20896815c6ff8c275d7646eb20702
MD5 602656892c583eec666c517478dbbe01
BLAKE2b-256 a4bc03ebff601d7a9967cbed0dd4ab703d46eab5dcd5252810032cecfdb007a5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.0-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 c7aa35c66ed276bf4a4220531abcee84992b9a312d76afb920d4cbae73d142c4
MD5 f178fba9febc5cc3ba152c46de075e2f
BLAKE2b-256 f2e4674e4b480d9bbcce1ddc283b3980e0a7a048cef9a8b61a390b833a33c4b8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.0-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 f5141e564b92d13c7e9378959bb7918b2e56015ae4076ea6224e0381be4ea345
MD5 9718a1aec42402b30151e822614bca87
BLAKE2b-256 e33a723db815dc89a993fbd076d941451dbcc9a00cbb2df92620b7cb3045ceff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.0-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 70ae8875af5377e0fd14c7fc1ddcb484a68d0e9864084574220349dd8d4f9335
MD5 3e34ce9e84c31819b108ce75a1c76997
BLAKE2b-256 54e8ad0ec7329dfc8cfd3de111196d7a9f975c4c068f541eddb8b8899e180d80

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.0-cp35-cp35m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 be1d264613a16532efe534c59d1f44d724e3d5fb90739ac1a672e83ad03ad95f
MD5 403b2356afbd5c261d107930490858f6
BLAKE2b-256 34fe4c681f02902c2eb24756e2bd6cb051f4bdc425077778d6b9cd3d19d0f99e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.0-cp35-cp35m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 14c97f87ac5320c56d3cdb75bdbe8560aa063a0d575fc4e0fb241a2c50f75a0e
MD5 3fcdc6992e18f1e51b91f66f2b02d6e5
BLAKE2b-256 24c59a4c76ad23e48978ea2821bbe14b5b688dd11f5a210e0c88a1ba051fd857

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.0-cp27-cp27mu-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 7db61f4c5db938d4106eb5c17c470085e372d934ef135e4feaa60eb4e4ac63a0
MD5 83e7462fd8d9c27c3bb8231bcb9e5167
BLAKE2b-256 3a65a9469dfdc7e4cb26e7a09c0d26cb6a6dc16ee65ce1882b4f5c4808d4d9c2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.0-cp27-cp27mu-manylinux1_i686.whl
Algorithm Hash digest
SHA256 6bc7da25b2361a9be1358dd8dc2278b97c27f23cbabcb4ee46c762311150815a
MD5 ad4a50b482d2e5bcdc061375e1f29e50
BLAKE2b-256 8251d56e450a19e2763572e9c74b0f6a719e43646f8430807ef9fb82d4520a19

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.0-cp27-cp27m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 a86985805e19f735defd4949cda5d322deb6f24003497f046b72e52e3d8c0429
MD5 41dd312621073e83791ea29f9109760f
BLAKE2b-256 9691f6ebb1b957f9bff8bd12ea8f3f03323b1f2e7240aaedaefe1107b2aede6e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for msgpack-0.5.0-cp27-cp27m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 b34ced36f7b6aa1c3bcf7afe9f250f11f34d846dd6b611fe3c59f43d459253f0
MD5 f5f0a0fc35060340c0daee1de8c924c7
BLAKE2b-256 ed51c2bfe3a2374b6737661072f11fe10577a0f1c4f2343634f14fa6ff170e31

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