记录类
recordclasses的Python项目详细描述
记录
Records是一个python库,它使强大的结构类变得容易。在
最简单的例子
Records的一个特性是,默认情况下,它只做namedtuple或dataclass所做的事情。在
fromrecordsimportRecordBaseclassPoint(RecordBase):x:floaty:floatz:float=0.0p0=Point(x=0,y=0)print(p0)# Point(x=0, y=0)print(p0.x)# 0# note that no type checking or coercion is performedprint(type(p0.y))# int# by default, the type hints are not even runp1=Point(x="hello",y="world",z="1.0")print(p1.y)# worldprint(type(p1.z))# str
检查、强制和验证
有时我们希望在参数进入结构之前对它们执行一些额外的处理。为此,我们有三个步骤:类型检查、强制和验证
- 类型检查是第一个也是最简单的步骤,它只是检查参数是否是我们期望的类型。如果不是的话,我们就强制执行。在
- 类型强制仅在类型检查失败时发生,它将尝试将转换为我们期望的类型。正如人们所料,存在大量的潜在强制力,因此它们必须单独添加。在
- 验证发生在类型检查或类型强制成功之后。到目前为止,我们确信输入的类型是正确的,我们希望确保/操作其值。在
这些方法是用Annotation
类型提示按字段描述的(Annotation
是python3.9中的新功能,但已由records
进行了后端口处理,以供旧版本使用)
这三个步骤在文档中进行了扩展,现在我们将展示一些简单的示例:
^{pr2}$解析
还可以从各种python原语解析记录。包括从dict
s、json甚至泛型名称空间进行解析。在
fromtypesimportSimpleNamespacefromrecordsimportRecordBase,checkclassUser(RecordBase,default_type_check=check):name:strpassword:strage:int=18print(User.from_mapping({"name":"richard","password":"swordfish"}))print(User.from_json('{"name": "richard", "password": "swordfish"})'))n=SimpleNamespace(user="rich",password="ard",age=7)print(User.from_instance(n))# parsing can even be done if you expect misnamed fields!from_upper_dict=User.from_mapping.select(keys_to_rename=[('user','name')],keys_to_remove=['favorite_color'])print(from_upper_dict({'user':'richard','password':'pw','favorite_color':'red'}))
您还可以定义自己的解析器,甚至可以在构造中使用它们!在
frommathimportsqrtfromrecordsimportRecordBase,check,SelectableFactory,parserclassPoint(RecordBase,default_type_check=check):x:floaty:floatz:float=0@parser@SelectableConstructor@classmethoddeffrom_tuple(cls,v):return{'x':v[0],'y':v[1],'z':v[2]iflen(v)>2else0}@propertydefnorm(self):returnsqrt(self.x**2+self.y**2+self.z**2)p=Point([2,3,6])print(p.norm)# 7
出口
还可以将记录导出为各种格式(与解析相同)。在
fromrecordsimportRecordBase,checkclassPoint(RecordBase,default_type_check=check):x:floaty:floatz:floatp=Point(x=2,y=3,z=6)print(p.to_dict())print(p.to_pickle())# again, we can select to change the keysprint(p.to_json.select(keys_to_add=[('w',0)])())
- 项目
标签: