简单和较差的对象数据映射程序库
froshki的Python项目详细描述
froshki是一个简单而糟糕的对象数据映射器库。
看起来很像WTForms, 而是专注于数据输入/输出抽象, 将验证或转换功能分离为API和扩展。
而不是与Web窗体等集成,旨在实现更灵活的属性采购。
功能
- 将数据架构定义为类定义。
- 通过关键字参数dict或两者提供数据输入。
- 使用用户定义的方法或与第三方库的内置集成转换和验证数据输入。
- 以属性/映射的形式访问已验证的数据。
- 很容易将函数挂接到验证上。
简单用法
原始演示:
>>> from froshki import Froshki, Attribute >>> >>> class ResourceId(Attribute): ... @classmethod ... def transform(klass, input_value): ... return int(input_value) ... @classmethod ... def validate(klass, input_value): ... if input_value in (1,5,7,9): ... return True, input_value ... else: ... return False, 'resource id not found' >>> >>> class Filetype(Attribute): ... @classmethod ... def transform(klass, input_value): ... return input_value.lower() ... @classmethod ... def validate(klass, input_value): ... if input_value in ('pdf', 'txt', 'mobi'): ... return True, input_value ... else: ... return False, 'filetype unavailable' >>> >>> class Download(Froshki): ... resource_id = ResourceId() ... filetype = Filetype() >>> >>> download = Download(resource_id='9', filetype='PDF') >>> download.validate() True >>> download.resource_id 9 >>> download.filetype 'pdf'
要使用froshki的任何函数,请扩展froshki.Froshki来定义数据模型模式。 属性通过在模型上附加froshki.Attribute子类来表示。
可以为属性添加任何数据转换(Attribute.transform)或验证(Attribute.validate)方法。 Froshki.validate转换并验证定义的所有属性。 但这有点麻烦,您可以使用支持属性定义的内置扩展。
使用Trafaret扩展
您需要预先安装trafaret才能使用扩展。 用法:
>>> from froshki import Froshki >>> import trafaret >>> from froshki.ext import trafaret_attr >>> >>> class SendInquiry(Froshki): ... user_name = trafaret_attr(trafaret.String())() ... user_contact = trafaret_attr(trafaret.Email())() ... message = trafaret_attr(trafaret.String(regex=r'\w{10,400}'))() >>> >>> send_inquiry = SendInquiry( ... user_name='yu mat', user_contact='drowse314@gmail.com', ... message='cannot post messages to my group' ... ) >>> send_inquiry.validate() True
如果您喜欢其他验证库, 你会发现扩展froshki.Attribute.validate非常容易。 或者支持一些内置的库:
有关扩展写入的文档或详细信息,请参见froshki/ext/*_attr.py。
其他功能
数据作为映射
某些实用程序属性可用于访问已验证的数据:
(...) >>> send_inquiry.data {'user_name': 'yu mat', 'user_contact': 'drowse314@gmail.com', 'message': 'cannot post messages to my group'} >>> send_inquiry.errors # error messages are registered if validation failed {}
此外,还可以使用映射初始化froshki.Froshki:
(...) >>> data = {'user_name': 'ymat', 'user_contact': 'drowse314.gmail.com', 'message': 'cannot post messages to my group'} >>> another_inquiry = SendInquiry(source=data) >>> another_inquiry.validate() False
具有别名的源属性
您可以使用不同于类属性名称的名称作为源属性:
>>> class ResourceAccess(Froshki): ... resource_id = Attribute() ... user_id = Attribute() ... resource_key = Attribute(key_alias='password') >>> access = ResourceAccess(resource_id='1276', user_id='ymat', password='VXFPF93') >>> access.resource_key 'VXFPF93'
额外验证
使用validation_hookdecorator:
>>> from froshki import Froshki, Attribute, validation_hook >>> >>> class SendInquiry(Froshki): ... user_name = Attribute() ... user_contact = Attribute() ... user_contact_confirmation = Attribute() ... message = Attribute() ... @validation_hook ... def confirm_email(self): ... return self.user_contact == self.user_contact_confirmation >>> >>> send_inquiry = SendInquiry( ... user_name='yu mat', user_contact='drowse314@gmail.com', user_contact_confirmation='drose@gmail.com', ... message='cannot post messages to my group' ... ) >>> send_inquiry.validate() False
如果您需要这些额外的验证器的错误信息,请按如下方式扩展decorator:
(...) >>> class SendInquiryExt(SendInquiry): ... @validation_hook.extend(error='inconsistent email inputs') ... def confirm_email(self): ... return self.user_contact == self.user_contact_confirmation >>> >>> send_inquiry = SendInquiry( ... user_name='yu mat', user_contact='drowse314@gmail.com', user_contact_confirmation='drose@gmail.com', ... message='cannot post messages to my group' ... ) >>> send_inquiry.validate() False >>> send_inquiry.errors {'confirm_email': 'inconsistent email inputs'}
子类和属性MIXIN < /H2>
froshki.Froshki子类可用作基类:
(...) >>> class Resource(Froshki): ... resource_id = ResourceId() >>> >>> class Download(Resource): ... filetype = Filetype() >>> >>> download = Download(resource_id='9', filetype='pdf') >>> download.validate() True如果您想在模式之间共享一些属性定义:,则使用PixMIX是有用的。
(...) >>> class UserMixin(object): ... user = Attribute() >>> >>> class DownloadAsUser(Download, UserMixin): ... pass >>> >>> download_as_someone = DownloadAsUser( ... resource_id='5', filetype='mobi', ... user='ymat', ... ) >>> download_as_someone.validate() True >>> download_as_someone.user 'ymat'
您可以通过附加^ {TT2}$实例来使用任何类作为属性混合 除了导致mro问题的froshki.Froshki子类。
其他选项
froshki.Froshki类有一些有用的选项。
- Froshki.default_values:提供属性默认值作为dict。
- Froshki.ignore_unkown_keys:控制source参数是否接受未定义为属性的名称(true/false)。
还有一些froshki.Attribute的选项。
- (作为参数)Attribute(nullable=<bool>):允许在验证中使用None(设置了任何验证方法)。