简单和较差的对象数据映射程序库

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(设置了任何验证方法)。

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

推荐PyPI第三方库


热门话题
jsoup有效文件路径抛出java。木卫一。FileNotFoundException   java如何在不删除和添加Mapbox中的层的情况下更改SymbolLayer的Z值?   java计算用户定义年数内四个季度的降雨量   如何在Java中轻松地将格式为“20 0F 01”的字符串更改为十六进制值?   java在JPA或Hibernate中“持久类”和“实体”之间有什么区别?   java Android:AlarmManager“缺少对unregisterReceiver()的调用?”当按下后退按钮时   logcat中的java错误“isDataSchedulerEnabled():false”   java i/p col特性必须是字符串或数字类型,但不能是org。阿帕奇。火花利纳格小姐。向量   java如何从Post请求url和浏览器转储中隐藏密码   多线程javamail中的java问题   java我的用户应该直接连接到数据库吗?如何将用户连接到数据库;   java如何获得Spring数据JPA存储库工厂?   windows java字节数组转换为字符串,但不同的操作系统会产生不同的结果   java代码在eclipse中编译,但不在命令行上编译