用于将词典映射到python对象的库
dict的Python项目详细描述
dictobject
子类化此类型可以声明对象模型。dictobject本身是 dict子类,以便可以作为属性或项访问对象属性:
classFoo(dicty.DictObject):foo=dicty.Field()obj=Foo(foo='bar')obj.foo# 'bar'obj['foo']# 'bar'
对象构造函数接受属性作为关键字参数,或者可以创建 使用fromjson()classmethod的实例,该方法接受对象字典(例如result json.loads())作为参数:
obj=Foo(foo='bar')obj=Foo.fromjson({'foo':'bar'})
您可以将dictobject实例直接传递到json库或调用jsonice() 方法首先返回对象的纯dict版本 声明字段剩余:
obj=Foo.fromjson({'foo':123,'bar':123})obj=={'foo':123,'bar':123}obj.jsonize()=={'foo':123}
名称别名
如果您不喜欢json对象、api等中的命名方案。迪克蒂允许 手动指定字典键时,选择您喜欢的任何python名称。为了 实例映射驼峰大小写键到它们的下划线对应项:
classFoo(dicty.DictObject):prop_foo=dicty.Field('propFoo')obj=Foo(prop_foo=123)obj=Foo.fromjson({'propFoo':123})obj.prop_fooobj['propFoo']
子类化
dictobject支持子类化:
classFoo(dicty.DictObject):foo=dicty.Field()classBar(Foo):bar=dicty.Field()obj=Bar.fromjson({'foo':1,'bar':2})printobj.jsonize()# {'foo': 1, 'bar': 2}
混炼也得到支持:
classFooMixIn(object):foo=dicty.Field()classBar(dicty.DictObject,FooMixIn):bar=dicty.Field()obj=Bar.fromjson({'foo':1,'bar':2})printobj.jsonize()# {'foo': 1, 'bar': 2}
字段
dicty.field是所有dicty字段的基类。你可以直接用它来 声明一个没有特殊类型信息的字段。
可选字段和默认值
访问未设置的字段将导致属性错误: 您可以为字段指定默认值:
classFoo(dicty.DictObject):foo=dicty.Field()obj=Foo()obj.foo# raises AttributeError
您可以将字段标记为可选字段,在这种情况下,如果 之前未设置:
classFoo(dicty.DictObject):foo=dicty.Field(optional=True)obj=Foo()obj.foo# None
对于可选字段,可以使用 默认值参数:
classFoo(dicty.DictObject):foo=dicty.Field(optional=True,default=123)obj=Foo()obj.foo# 123obj=={}
请注意,默认值不影响内部字典。但是如果 默认值为not hashable dict key将在getattraccess上设置。
还有一个选项suplydefault_func它为 对象的字段。它将对象实例作为参数。返回值 默认函数始终存储在dict:
classFoo(dicty.DictObject):id=dicty.Field(optional=True,default_func=lambdaobj:uuid.uuid4().hex)obj=Foo()obj=={}obj.id# Would be populated with newly generated UUIDobj=={'id':'07d0af8affaf46c885cc251e17dbc37a'}
可用字段
Dicty随附以下内容:
布尔字段
日期字段
日期时间字段
dictfield
浮动字段
整数域
列表字段
国家数据字段
国家日期字段
数字字段
regexpstringfield
字符串字段
typeddictfield
类型列表字段
typedobjectfield
示例用法
使用dicty,您可以轻松地描述数据模型,然后使用它对json对象进行编码/解码。它支持 数据验证、可选参数、默认值、嵌套对象等。
importdictyclassMyDoc(dicty.DictObject):prop1=dicty.StringField()prop2=dicty.IntegerField()# Regular constructordoc=MyDoc(prop1='foo',prop2=123)printdoc.prop1# you can access values as attributesprintdoc['prop2']# as well as dictionary itemsprintjson.dumps(doc)printjson.dumps(doc.jsonify())# Jsonify will clean and validate output data# Create instance from dictionarydoc=MyDoc.fromjson({'prop1':'foo','prop2':123})# would raise dicty.FieldError heredoc=MyDoc.fromjson({'prop1':123,'prop2':123})
嵌套对象
importdictyclassFoo(dicty.DictObject):classBar(dicty.DictObject):prop=dicty.StringField()bar=dicty.TypedObjectField(Bar)obj=Foo()obj.bar.prop=123printobj# {'bar': {'prop': 123}}
Mongo样式的关键路径
dicty允许构建可用于创建mongo查询的关键路径:
classFoo(dicty.DictObject):bar=dicty.Field('myBar')printFoo.bar# 'myBar' full path to the itemprintFoo.bar.key# 'myBar' only leaf keyprintFoo.bar.attname# 'bar' python attribute name
嵌套对象:
classBar(dicty.DictObject):foo=dicty.TypedObjectField(Foo)printBar.foo# 'foo'printBar.foo.bar# 'foo.myBar'
对象列表:
classBar(dicty.DictObject):items=dicty.TypedListField(Foo)printBar.items.foo# 'items.myBar' without indexprintBar.items[0].foo# 'items.0.myBar' indexed path
对象指令:
classBar(dicty.DictObject):items=dicty.TypedDictField(Foo)# With indexprintBar.items['maurice'].bar# 'items.maurice.myBar'# Would raise IndexErrorprintBar.items['x.y'].bar