围绕msgpack的一个薄包装,用于处理原始datetime和ruamel定义的扩展类型(日期)
项目描述
ruamel.ext.msgpack是围绕msgpack的一个薄包装,用于处理原始datetime实例和ruamel定义的扩展类型(日期)。
原始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 上进行 bytes 到 str 的转换,可以构造一个备选的 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 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 51e9ebd1d28245a6816eb7aad2f8d672ff921d2c55e864cd68b8cb798f6753d6 |
|
MD5 | 02fe63f8662e60c5dad431abefd0a2b0 |
|
BLAKE2b-256 | b59435e8e0cac3a5d6ac51efe039373e141c373417d88c22140726a65719d037 |
ruamel.ext.msgpack-0.2.2-py3-none-any.whl 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7a0ec51f0a7e7fa0f078bf1d1e1d3f643b055a2446fb230444979253e31f394c |
|
MD5 | e1f085e0871b2df23b36abffae61e378 |
|
BLAKE2b-256 | d5ebe25e14f825fe88e5f4f51455db62b7c329b96d2a68eb8aa47f7e382612c5 |