严格听写
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'