用于创建数据类实例的实用程序类
dataclass-factor的Python项目详细描述
数据类工厂
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
/dump
methods
速度。它比棉花糖和dataclasses.asdict快10倍(参见基准测试)。
- 自动名称样式转换(例如
snake_case
到camelcase
) - 自动跳过"内部使用"字段(带前导下划线)
- 框中支持枚举、键入的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,类型分析将停止。
因此类型参数的顺序很重要。
序列化也非常简单:使用serializer
或load
方法
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返回预解析
,后解析
,预序列化
,后序列化
-将用作附加解析/序列化步骤的可调用项。
目前,非数据类类型只支持serializer
和parser
。
示例,
@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_factory0
您需要解析以下结构,得到a("hello","world")
结果:
pip install dataclass_factory1
您只需要创建这样一个模式并使用factory
pip install dataclass_factory2
重要信息:当序列化以列出所有没有要放置字段的列表项时,将填充"无"。
附加步骤
您可以设置pre-parse
,post-parse
,pre-serialize
和post-serialize
架构属性,以提供额外的解析/序列化步骤。
例如,如果要将某个字段存储为包含json数据的字符串,并检查其他字段的值,可以编写如下代码
pip install dataclass_factory3
重要信息:传递到预序列化的数据不是副本。请小心修改。
在某些情况下,不创建模式实例,而是创建子类是有用的。
pip install dataclass_factory4
重要:
- 工厂为填充丢失参数的每种类型创建一个架构副本。如果需要访问模式中的某些数据,
使用
factory.schema
方法获取schema的工作实例 - 由于多线程或递归结构,单个模式实例可以同时使用多个时间。 小心修改模式中的数据 < > >
- 数值类型(
int
,float
,decimal
) bool
str
,bytearray
列表
元组,包括类似于
元组[int,…]
或元组[int,str,int]
dict
枚举
使用其值进行转换可选
any
,使用此类型在解析期间不会进行转换。但是序列化是基于真实的数据类型的工会
数据类
泛型
数据类datetime
和uuid
可以使用预定义模式进行转换- 自定义类可以使用其
\u init\u方法中的信息自动解析。
或者您可以提供自定义praser/serializer - 应拒绝单独的
parserializerfactory
和serializerfactory
工厂,而应拒绝factory
trim_trailing_下划线
工厂参数移动到默认模式
键入工厂
,名称样式
和键入序列化程序
移动到模式
dictdict_factory
与asdict一起使用的函数必须替换为基于
factory
的seralization,因为它更快parse
方法必须替换为基于工厂的解析,因为它要快得多
支持的类型
从以前版本更新
在1.1+版本中:
在版本中<;1.1:
在<;1.0版中:
所有旧的方法和类仍然可用,但已弃用的ant将在以后的版本中被删除