用于将词典映射到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

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

推荐PyPI第三方库


热门话题
java使用CSPRNG中的序列种子PRNG安全吗?   java如何使JTable列大小与内容精确(或紧密)匹配?   java Android textview具有两种不同大小的文本   java在任意事物的列表(数组)中创建关联的最佳方法是什么?   java保存可扩展字符串?   java成员类(内部类)如何访问外部类的实例变量?   java使用Android 6.0(API级别23)使用rest的最佳方式是什么   java为什么我会收到“学习记录”。Student@25a43blb'尝试显示链接列表中的所有对象时?   java如何将SVG文本转换为SVG路径?   java Paypal返回URL参数支付状态   java Libgdx:导出到可运行Jar   java JPA获取连接实体的最小/最大属性   附加到类型变量的java编号?   java Object[]到底是什么?   java如何在安卓中的片段和活动之间共享数据   java使用MinGW为windows构建linux库   java将变量值传递给eval函数   java仅在转换完成时使方法返回   Java二维数组对角线