帮助组合对象以构建json。
emitjson的Python项目详细描述
帮助组合对象以发出json。
emitjson.repository()创建一个函数库,用于将各种类型的对象转换为对json友好的对象。存储库是一个single-dispatch generic function,如果类型的转换器已注册,则返回已转换的对象。
存储库包含一些json模块不支持的类型的默认转换器,例如set()或datetime.datetime()。此外,默认存储库还返回标准容器类型(浅层)的副本,例如collections.abc.Mapping或collection.abc.Sequence。容器对象中的项也会递归转换。
>>> import datetime >>> import emitjson >>> my_repo = emitjson.repository() # create emitjson repository >>> src = [1, 2, datetime.datetime.now(), {4, 5, 6}] >>> new = my_repo(src) >>> print(new) (1, 2, '2016-04-20T22:09:18.731157', (4, 5, 6))
您可以将自己的转换器添加为singledispatch function。下面的示例添加一个转换器以从bytes对象生成base64字符串。
>>> import emitjson >>> import base64 >>> my_repo = emitjson.repository() # create emitjson repository >>> @my_repo.register(bytes) >>> def conv_bytes(obj): ... # encode bytes object in Base64 format ... return base64.b64encode(obj).decode('ascii') ... >>> print(my_repo([b'abcd'])) ('YWJjZA==', )
还可以定义映射器类以将对象转换为字典。
from emitjson repository, attr, ObjConverter class Class1: def __init__(self): self.prop1 = 'spam' self.prop2 = 'ham' class Class2: def __init__(self): self.prop3 = [Class1()] my_repo = emitjson.repository() # create emitjson repository @my_repo.register(Class1) class Class1Converter(ObjConverter): prop1 = attr # get obj.prop1 prop2 = attr # get obj.prop2 @my_repo.register(Class2) class Class2Converter(ObjConverter): prop_x = attr('prop3') # get obj.prop3 but store as 'prop_x'
要求
- python 3.4或更高版本
功能
@存储库()
创建对象转换器的存储库。存储库是single-dispatch generic function的实例。
默认情况下,存储库覆盖以下类型。
- collections.abc.Sequence对象转换为tuple。序列中的元素是递归转换的。
- collections.abc.Mapping的键和值是递归转换的。
- datetime.date和datetime.datetime对象转换为isoformat()字符串。
objconverter类
ObjConverter类创建从任意对象到字典的转换器。从对象获取的值也会递归转换。
要转换的属性名定义为ObjConverter类的attr类成员。
如果ObjConverter的属性是attr的实例,attrname参数指定要转换的属性名。
生成的dict对象也会递归转换。
objconverter.on_convert(obj,值)
on_convert方法被调用以获取obj的属性并将该值存储到values字典中。您可以重写on_convert()方法以自定义转换。
class Class3: prop = 1 @myrepo.register(Class3) class Class3Converter(ObjConverter): def on_convert(self, obj, values): super().on_convert(obj, values) values['dynamic_prop'] = obj.prop print(myrepo(Class3()) # prints {'dynamic_prop': 1}
attr(attrname=none,map=none)类
转换对象的属性。
attrname如果不省略,则重写属性名。
map参数是将目标对象转换为任意对象的函数。
SamodelConverter类
SAModelConverter类从sqlalchemy模型创建转换器。除非在类的IGNORES成员中指定,否则将转换模型的列。
class Test(Base): __tablename__ = 'test' a = Column(Integer, primary_key=True) b = Column(Integer) c = Column(Integer) d = Column(Integer) @myrepo.register(Test) class TestModelConverter(SAModelConverter): IGNORES = ('c', 'd') # ommit Test.c and Test.d
repository.fromSqlAlchemyModel(模型,attrs=none,忽略=none)
另一种注册sqlalchemy模型转换器的方法。除非列的名称在ignore参数中列出,否则将转换模型的列。attrs是键名和attr对象的字典。
# Converts Test model myrepo.fromSQLAlchemyModel(Test, attrs={ 'fld1': attr, # Emits Test.fld1 as value of 'fld1' 'X_VALUE':attr('fld_X') # Emits Test.fld_X as value of 'X_VALUE' }, ignores=('fld3', 'fld4')) # ignore Test.fld3 and Test.fld2
djangomodelconverter类
DjangoModelConverter类从django模型创建转换器。除非在类的IGNORES成员中指定,否则将转换模型的列。
class DjangoModel(models.Model): charattr = models.CharField(max_length=10) intattr = models.IntegerField() @myrepo.register(DjangoModel) class TestModelConverter(DjangoModelConverter): pass
repository.fromSqlAlchemyModel(模型,attrs=none,忽略=none)
另一种注册django模型转换器的方法。除非列的名称在ignore参数中列出,否则将转换模型的列。attrs是键名和attr对象的字典。
# Converts Test model myrepo.fromDjangoModel(Test, attrs={ 'fld1': attr, # Emits Test.fld1 as value of 'fld1' 'X_VALUE':attr('fld_X') # Emits Test.fld_X as value of 'X_VALUE' }, ignores=('fld3', 'fld4')) # ignore Test.fld3 and Test.fld2
版权所有
版权所有(c)2016 Atsuo Ishimoto
兹免费准许任何人取得副本 本软件和相关文档文件(“软件”)的 在软件中不受限制,包括但不限于 使用、复制、修改、合并、发布、分发、再授权和/或出售 软件的副本,并允许软件的用户 在满足以下条件的情况下,可以这样做:
上面的抄袭者GHT通知和本许可通知应包括在: 软件的所有副本或大部分。
软件按原样提供,无任何形式的保证,明示或 默示的,包括但不限于适销性保证, 适合某一特定目的和非侵犯性。在任何情况下 作者或版权所有者应对任何索赔、损害或其他 责任,无论是在诉讼或合同中,侵权行为或其他,产生于, 不属于或与软件、使用或其他交易有关 软件。