Python 序列化结果

Python 序列化结果,序列化是将Python数据转换成适合传输的字节流。每种格式最好用一个简单的函数来描述,该函数只序列化这一种格式。随后可以在特定序列化器列表中选取一个顶层通用序列化器。可使用以下函数集合选择序列化器:

Serializer = Callable[[str, List[Pair]], bytes]
SERIALIZERS: Dict[str, Tuple[str, Serializer]]= {
    'xml': ('application/xml', serialize_xml),
    'html': ('text/html', serialize_html),
    'json': ('application/json', serialize_json),
    'csv': ('text/csv', serialize_csv),
}

def serialize(
        format: str, title: str, data: List[Pair]
    ) -> Tuple[bytes, str]:
    mime, function = SERIALIZERS.get(
        format.lower(), ('text/html', serialize_html))
    return function(title, data), mime

整个serialize()函数负责在SERIALIZERS字典中定位某个特定的序列化器,该字典将格式名称映射到一个二元组。该元组有一个MIME类型,且必须在响应中使用来表示结果。该元组还包含一个基于Serializer类型提示的函数。该函数会把名称和Pair对象列表转换为待下载的字节对象。

函数serialize()没有转换任何数据。它只是将名称映射到负责执行转换的函数,返回一个函数使得整个应用程序可以管理内存的详细情况或文件系统的序列化。尽管对文件系统进行序列化很慢,但它可以处理大的文件。

下面讲解各个序列化器。它们可以分为两组:生成字符串的序列化器和生成字节码的序列化器。生成字符串的序列化器需要将字符串编码为字节以供下载。生成字节码的序列化器无须任何额外操作。

对于生成字符串的序列化器,可以使用带有标准化字节转换函数的复合函数。可以实现标准化字节转换的装饰器如下所示:

from typing import Callable, TypeVar, Any, cast

from functools import wraps
def to_bytes(
        function: Callable[..., str]
    ) -> Callable[..., bytes]:
    @wraps(function)
    def decorated(*args, **kw):
        text = function(*args, **kw)
        return text.encode("utf-8")
    return cast(Callable[..., bytes], decorated)

这样就创建了一个名为@to_bytes的小型装饰器。它会对给定的函数进行求值,然后使用UTF-8将结果编码为字节码。请注意,装饰器将被装饰函数的返回值类型从str变为了bytes。至此,还没有正式声明被装饰函数的参数,以及使用...来替代实现细节。下面将展示如何配合JSON、CSV和HTML序列化器来使用该装饰器。XML序列化器会直接生成字节码,因此不需要使用这个附加函数进行复合。

也可以在对serializers映射的初始化中进行函数式复合。可以装饰函数对象的引用,而非装饰函数定义。序列化器映射的另一种定义如下:

SERIALIZERS = {
    'xml': ('application/xml', serialize_xml),
    'html': ('text/html', to_bytes(serialize_html)),
    'json': ('application/json', to_bytes(serialize_json)),
    'csv': ('text/csv', to_bytes(serialize_csv)),
}

这样就把函数定义中的装饰器替换为了在构建数据结构映射时使用的装饰器。这种延后装饰的形式可能会令人困惑。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程