用于创建数据类实例的实用程序类

dataclass-factor的Python项目详细描述


数据类工厂

pypi version构建状态

dataclass_factory是将数据类或其他对象转换为更常见类型(如dicts)的现代方式

tl;dr

安装

pip install dataclass_factory

使用

fromdataclassesimportdataclassimportdataclass_factory@dataclassclassBook:title:strprice:intauthor:str="Unknown author"data={"title":"Fahrenheit 451","price":100,}factory=dataclass_factory.Factory()book:Book=factory.load(data,Book)# Same as Book(title="Fahrenheit 451", price=100)serialized=factory.dump(book)

要求

  • python=3.6

您可以在python 3.6和从pip安装的dataclass库中使用dataclass\u factory

在python 3.7上,它没有python标准库之外的外部依赖项。

优点

  • 简单情况下不需要模式或配置。只需创建factory并调用load/dumpmethods
  • 速度。它比棉花糖和dataclasses.asdict快10倍(参见基准测试)。
  • 自动名称样式转换(例如snake_casecamelcase
  • 自动跳过"内部使用"字段(带前导下划线)
  • 框中支持枚举、键入的dict、元组和列表
  • 支持联合和选项,而无需在模式中定义它们
  • 通用数据类也可以自动解析
  • 循环引用结构(如链表或树)也可以转换

用法

分析器和序列化器

要解析dict createfactory,请获取并使用parser或调用load方法

factory=Factory()# create it only onceparser=factory.parser(Book)# save it to reuse multiple timesbook=parser(data)# or book=factory.load(data,Book)

重要: 分析union的数据时,如果未检测到valueerror/typeerror,类型分析将停止。 因此类型参数的顺序很重要。

序列化也非常简单:使用serializerload方法

factory=Factory()# create it only onceserializer=factory.serializer(Book)# you can reuse otdata=serializer(book)# or data=factory.dump(book,Book)

如果在dump方法中没有提供类,它将根据对象的实际类型找到序列化程序。

每个解析器/序列化器都是在首次使用(或从工厂检索)时创建的。 工厂缓存所有创建的分析器和序列化器,因此每个设置包只创建一次。

重要: 序列化union类型的数据时,将忽略类型参数,并根据实际数据类型检测序列化程序。

配置

Factory(debug_path:bool,default_schema:Schema,schemas:Dict[Type,Schema])

更多详细错误

调试路径参数用于启用详细错误模式。

如果此模式invalidFieldRor在无法分析某个数据类字段时抛出。 它包含字段路径这是提供的数据(键和索引)中字段的路径。

模式

模式用于更改解析/序列化某些类或一般类的行为的实例。

  • 默认模式是默认使用的模式
  • schemas是dict,类型是键,对应的schema实例是值。

如果未为架构设置某些设置(或设置为none),则使用default_schema中的设置。 如果还未设置,则将使用库默认值

架构包括:

  • 名称映射-指定数据类字段名称(映射中的键)和序列化形式的键之间的映射。
  • 仅映射默认为false)-如果为true,则跳过名称映射中未指定的所有字段。
  • 仅限-解析和序列化期间使用的字段列表。优先级高于仅映射的跳过的内部参数
  • 排除字段-分析和序列化期间不使用的字段列表。具有比仅更高的优先级
  • skip_internal默认为true)-排除带前导下划线(u)的字段。影响在名称映射中未指定的字段
  • 修剪下划线默认为true)-如果为true,则将删除除名称映射中指定的字段以外的所有字段的尾随下划线
  • 名称样式默认情况下为snake_case)-目标字段名称样式。应用于名称映射中未指定的字段
  • 序列化程序-自定义函数,用于转储由架构分配的类型的数据。
    通常不应在默认模式中使用它
    它也从factory.serializer返回
  • 解析器-自定义函数,用于加载由模式分配的类型的数据。
    通常不应在默认模式中使用它
    它也从factory.parser返回
  • 预解析后解析预序列化后序列化-将用作附加解析/序列化步骤的可调用项。

目前,非数据类类型只支持serializerparser

示例,

@dataclassclassPerson:_first_name:strlast_name_:strfactory=Factory(schemas={Person:Schema(trim_trailing_underscore=True,skip_internal=False)})person=Person("ivan","petrov")serial_person={"_first_name":"ivan","last_name":"petrov"}assertfactory.dump(person)==serial_person

常见模式

模式帮助程序模块包含几个常用的模式:

  • unixtime_schema-将datetime转换为unixtime,反之亦然
  • isotime_schema-将datetime转换为包含iso 8081的字符串。仅在Python3.7+上受支持
  • uuid_模式-将uuid转换为字符串

示例:

factory=Factory(schemas={UUID:schema_helpers.uuid_schema,datetime:schema_helpers.isotime_schema,})

名称样式

对于字段名(snake_case),必须遵循PEP8惯例,否则样式转换将无法正常工作

factory=Factory(default_schema=Schema(name_style=NameStyle.camel))@dataclassclassPerson:first_name:strlast_name:strperson=Person("ivan","petrov")serial_person={"FirstName":"ivan","LastName":"petrov"}assertfactory.dump(person)==serial_person

支持以下名称样式:

  • (蛇形外壳)
  • 烤肉串(烤肉串盒)
  • 驼色更低(驼色更低)
  • 驼色(驼色表壳)
  • 小写(小写)
  • 大写(大写)
  • 上蛇座(上蛇座)
  • 骆驼蛇(骆驼蛇)
  • dot(点大小写)

泛型类

可以使用转储和加载泛型数据类的实例。 您可以为泛型或具体类型设置架构,但有一个限制: 它不是在转储时无法检测具体类型的数据类。因此,如果需要为不同的具体类型设置不同的模式,则在转储数据时应将其排他设置。

T=TypeVar("T")@dataclassclassFakeFoo(Generic[T]):value:Tfactory=Factory(schemas={FakeFoo[str]:Schema(name_mapping={"value":"s"}),FakeFoo:Schema(name_mapping={"value":"i"}),})data={"i":42,"s":"Hello"}assertfactory.load(data,FakeFoo[str])==FakeFoo("Hello")assertfactory.load(data,FakeFoo[int])==FakeFoo(42)assertfactory.dump(FakeFoo("hello"),FakeFoo[str])=={"s":"hello"}# concrete type is set explicitlyassertfactory.dump(FakeFoo("hello"))=={"i":"hello"}# generic type is detected automatically

结构扁平化

由于版本2.2,您可以在解析时展平数据的层次结构。 此外,还可以将平面数据类序列化为复杂结构。

要启用configure thi行为,只需在字段映射中使用元组而不是字符串。 提供数字以创建列表和字符串以创建听写。

例如,如果您有简单的数据类:

pip install dataclass_factory
0

您需要解析以下结构,得到a("hello","world")结果:

pip install dataclass_factory
1

您只需要创建这样一个模式并使用factory

pip install dataclass_factory
2

重要信息:当序列化以列出所有没有要放置字段的列表项时,将填充"无"。

附加步骤

您可以设置pre-parsepost-parsepre-serializepost-serialize架构属性,以提供额外的解析/序列化步骤。

例如,如果要将某个字段存储为包含json数据的字符串,并检查其他字段的值,可以编写如下代码

pip install dataclass_factory
3

重要信息:传递到预序列化的数据不是副本。请小心修改。

模式继承

在某些情况下,不创建模式实例,而是创建子类是有用的。

pip install dataclass_factory
4

重要

  1. 工厂为填充丢失参数的每种类型创建一个架构副本。如果需要访问模式中的某些数据, 使用factory.schema方法获取schema的工作实例
  2. 由于多线程或递归结构,单个模式实例可以同时使用多个时间。 小心修改模式中的数据
  3. < > >

    支持的类型

    • 数值类型(intfloatdecimal
    • bool
    • strbytearray
    • 列表
    • 元组,包括类似于元组[int,…]元组[int,str,int]
    • dict
    • 枚举使用其值进行转换
    • 可选
    • any,使用此类型在解析期间不会进行转换。但是序列化是基于真实的数据类型的
    • 工会
    • 数据类
    • 泛型数据类
    • datetimeuuid可以使用预定义模式进行转换
    • 自定义类可以使用其\u init\u方法中的信息自动解析。
      或者您可以提供自定义praser/serializer

    从以前版本更新

    在1.1+版本中:

    • 应拒绝单独的parserializerfactoryserializerfactory工厂,而应拒绝factory
    • trim_trailing_下划线工厂参数移动到默认模式
    • 键入工厂名称样式键入序列化程序移动到模式dict

    在版本中<;1.1:

    • dict_factoryasdict一起使用的函数必须替换为基于factory的seralization,因为它更快

    在<;1.0版中:

    • parse方法必须替换为基于工厂的解析,因为它要快得多

    所有旧的方法和类仍然可用,但已弃用的ant将在以后的版本中被删除

    欢迎加入QQ群-->: 979659372 Python中文网_新手群

    推荐PyPI第三方库


热门话题
java操作数组上的字符串   java JAXB内容未实例化   图形在Java中如何绘制垂直居中的字符串?   java Apache Ant:使用Junit时出现NoClassDefFoundError   java无法从服务器上运行perl脚本   如何在java中沿树进行预排序遍历,并打印0和1以对应每个节点上的特定字符?   java如何创建。p12文件?   java线程访问无效   java只匹配命名空间中的XML节点,而不知道NS前缀   从java获取2d arraylist元素   数组Java动态集合对象   java Xpath通过通配符或布尔运算查找以相同名称开头的节点?   java注释元素类型   java在中看不到Super()。反编译后的类文件