严格听写

strictus-dictus的Python项目详细描述


pip install strictus-dictus

StrictusDictus(又名sdict)是特殊dict子类的基类,其实例只接受 在类的类型提示中声明的键。

这对于数据传输对象定义很有用,例如,当您表达其他人的 代码中的json或yaml模式,并希望使用点表示法访问解析字典的内容 并让ide自动完成属性名。

sdict适合嵌套结构。

fromstrictus_dictusimportsdictclassHeader(sdict):title:str="Hello, world!"# default valuesent:strclassTag(sdict):value:strclassMessage(sdict):header:Headerbody:strtags:List[Tag]source={"header":{"sent":"2018-10-20 18:09:42",},"body":"What is going on?","tags":[{"value":"unread",},],}# Parse the messagemessage=Message(source)# Access attributesassertmessage.header.title=="Hello, world!"assertmessage.tags[0].value=="unread"# It still is a dictionary so this works too:assertmessage["header"]["title"]=="Hello, world!"# Convert back to a standard dictionarymessage.to_dict()

这些键的值可以作为带有点符号和[]符号的属性访问, 但是,如果源字典缺少键,StrictusDictus将不会引入它,因此访问 via[]符号将按预期引发一个KeyError。 但是,属性将被初始化以保存特殊的EMPTY值。

要创建实例,请使用YourClass(standard_dict)并导出到标准字典 使用YourClass().to_dict()

StrictusDictus只支持有限的类型提示集。不支持的类型提示将 将被静默忽略,值将返回未处理。

支持的类型提示是(SD表示从StrictusDictus继承的任何类):

classExamples:x1:primitive_type# could be any type, but not from typing.*; value won't be processedx2:List# unprocessed listx3:Dict# unprocessed dictionaryx4:SDx5:List[SD]x6:Dict[str,SD]

可以用List[Any]Dict[Any, Any]注释x,但不会处理这些值 通过StrictusDictus

限制

  • sdict子类不能在其类型提示中引用自身(甚至不能使用前向引用)。

数据类?

数据类是一个很好的构建块,但它并不认真对待字典。

@dataclasses.dataclassclassPoint:x:floaty:float@dataclasses.dataclassclassLine:start:Pointend:Pointline=Line(**{"start":{"x":1,"y":1},"end":{"x":5,"y":5}})

我希望line.end.y保存值5,但事实并非如此。实际上,print(line.end.y) 引发一个AttributeError

AttributeError:'dict'objecthasnoattribute'y'

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

推荐PyPI第三方库


热门话题
java优雅地完成SoftReference引用   java在cucumber框架的报告中生成json后,在何处调用jar文件(ATM)?   使用itext从html生成pdf时不采用java CSS样式   java错误:intellij错误。应用程序编程接口。cli。主要的   fitnesse Web测试Java测试客户端   java Powermock和Mockito。避免在模拟和存根同一类时对类进行静态初始化   Windows 10出现安装Java错误   java针对两种不同的注入依赖项运行单元测试   java firebase数据库的总值   排序Java7比较方法违反了它的一般约定(TimSort.java)   javascript Selenium:如何检查匿名函数的代码   java如何在安卓中解决“输入必须在256字节以下”的问题?   java如何解决实际上Mockito中没有与此模拟错误交互的问题   java线程在第一次运行时启动,然后在下一次运行时停止   java无法找到资源,尽管文件位于类路径中   java如何将LocalDate转换为特定的日期时间格式   用于Weblogic 10和Oracle 11g的java JDBC版本   java方法在结束之前返回