记录类

recordclasses的Python项目详细描述


{1}$ codecov

记录

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原语解析记录。包括从dicts、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)])())

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

推荐PyPI第三方库


热门话题
Gson类中的java验证错误   If和elseif之间的java差异?   字典Java8地图。输入比较器   java连接到远程计算机以获得WMI支持   java如何使用改型处理JSON对象中的空值   在Java中使用Comparator时不可编译的源代码   java将Jar添加到JSP的运行时路径   带有随机对象的while循环的java大O时间复杂性   java可以在不考虑参数的情况下模拟方法吗?   java我有一个简单的代码,它不工作。无法修复错误“println”   向eclipse添加Xively java库   java是否可以启用本机代码的缓存?   全局变量如何在Java中的所有类之间共享要使用的语言环境?   Java内存游戏如何翻转单个卡?