跳转到主要内容

围绕msgpack的一个薄包装,用于处理原始datetime和ruamel定义的扩展类型(日期)

项目描述

ruamel.ext.msgpack是围绕msgpack的一个薄包装,用于处理原始datetime实例和ruamel定义的扩展类型(日期)。

https://sourceforge.net/p/ruamel-ext-msgpack/code/ci/default/tree/_doc/_static/license.svg?format=raw https://sourceforge.net/p/ruamel-ext-msgpack/code/ci/default/tree/_doc/_static/pypi.svg?format=raw https://sourceforge.net/p/oitnb/code/ci/default/tree/_doc/_static/oitnb.svg?format=raw

原始datetime.datetime

如果您尝试打包一个原始datetime.datetime实例,您将得到一个错误

import datetime
from msgpack import packb

try:
    packb(datetime.datetime(2011, 10, 2), datetime=True)
except Exception as e:
    print('exception:', type(e), e)

该错误将打印

exception: <class 'ValueError'> can not serialize 'datetime.datetime' object where tzinfo=None

使用来自ruamel.ext.msgpack的pack/packb将从不会发生这种情况,而无需遍历数据结构并替换所有原始datetime.datetime实例。它将提供一个处理原始日期戳和一些扩展类型的default参数,设置use_bin_type=True和datetime=True。

import sys
import datetime
from ruamel.ext.msgpack import packb, unpackb

res = packb(datetime.datetime(2011, 10, 2, 17, 15, 1))
print(unpackb(res))

该错误将打印

2011-10-02 17:15:01+00:00

如输出所示,这将使读取回的实例具有时区感知。

use_bin_type=True

pack和packb例程不更改默认use_bin_type=True。因此,UTF-8“字节数组”以bin 8/16/32格式输出,而不是以效率略高的“fixstr”格式输出(字符串长度最多31字节)。在下文中,函数hex()返回从传入的字节数组中获取的十六进制值字符串

from ruamel.ext.msgpack import packb, unpackb, hex

res = packb('こんにちは世界')
print(hex(res), len(res))
print(unpackb(res))
res = packb('こんにちは世界'.encode('utf-8'))
print(hex(res), len(res))
print(unpackb(res))

\xb5 表示长度为 21 的“fixstr”,\xc4\x15 表示长度为 21 的“bin 8”

\xb5\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\xe4\xb8\x96\xe7\x95\x8c 22
こんにちは世界
\xc4\x15\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\xe4\xb8\x96\xe7\x95\x8c 23
b'\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\xe4\xb8\x96\xe7\x95\x8c'

如果您不需要字节数组,并且在 msgpack-roundtrip 上进行 bytesstr 的转换,可以构造一个备选的 pack/unpack 版本,它仍然可以处理简单的 datetime 对象以及 ruamel.ext.msgpack 提供的其他类型。

from functools import partial
from ruamel.ext.msgpack import hex, unpackb, msgpack_default
import msgpack

pack = partial(msgpack.pack, default=msgpack_default, use_bin_type=False, datetime=True)
packb = partial(msgpack.packb, default=msgpack_default, use_bin_type=False, datetime=True)

res = packb('こんにちは世界'.encode('utf-8'))
print(hex(res), len(res))
print(unpackb(res))

尽管现在打包 bytes,但 \xb5 仍表示长度为 21 的“fixstr”,解包结果为 str

\xb5\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\xe4\xb8\x96\xe7\x95\x8c 22
こんにちは世界

扩展类型

ruamel.ext.msgpack 提供以下扩展类型。每个类型都与 msgpack_default 上的类型编号相关联。此编号可以更改,但在打包和解包时应使用相同的编号。如果将编号设置为 None,则不会打包或解包关联的类型。用于简单的 datetime.datetime(编号为 -1)的类型不能更改。

datetime.date

Python 的 datetime.date 实例以两个字节的结构打包,用于 2000-01-01 和 2126-12-31 范围内的日期。

import datetime
from ruamel.ext.msgpack import packb, unpackb, hex, msgpack_default

res = packb(datetime.date(2011, 10, 2))
print('hex:', hex(res), len(res))
print(unpackb(res))
print(f'{msgpack_default.date=}')

msgpack_default.date = 42
res = packb(datetime.date(2011, 10, 2))
print('hex:', hex(res), len(res))
print(unpackb(res))

try:
    msgpack_default.date = None
    res = packb(datetime.date(2011, 10, 2))
except Exception as e:
    print('exception:', type(e), e)

该错误将打印

hex: \xd5\x11\x17\x82 4
2011-10-02
msgpack_default.date=17
hex: \xd5\x11\x17\x82 4
2011-10-02

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分发

ruamel.ext.msgpack-0.2.2.tar.gz (14.7 kB 查看哈希)

上传时间

构建分发

ruamel.ext.msgpack-0.2.2-py3-none-any.whl (6.0 kB 查看哈希)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面