简化python3中类型化和约束值对象的创建和使用

typefactor的Python项目详细描述


打字机

TypeFactory处于alpha状态。API、类型和异常可能会发生重大变化。

TypeFactory简化了类型化和约束值对象的创建和使用。在

为什么?在

传递原始值(字符串、int、float等)往往会导致单个应用程序中多个层的代码检查约束,然后随着不同层约束检查的不同而导致不一致和错误。在

通过基于受约束类型将原始数据强制转换为值对象,并使用可选的类型检查:

  • 域概念和规则可以封装在值对象的尽可能低的级别
  • 代码变得更加清晰,并与领域概念相联系
  • 专门用于数据验证的代码量可以减少并集中
  • 与坏数据相关的错误可能会减少
  • 验证很自然地被推到应用程序边界,留下可以专注于实现域逻辑/业务规则的代码

特点

  • 使用约束扩展现有类型
  • 与JSON模式约束相匹配的字符串和数字类型的内置约束(例如最小值、多个\u-of、模式等…)
  • 为任何类型创建自定义约束
  • 内省类型和值以提取和利用它们的约束,例如在创建HTML表单时
  • 报告值的所有失败约束的扩展值错误异常

示例

定义类型

fromtypefactoryimportmake_typefromtypefactory.constraintsimportstring,numericId=make_type(str,"Id",[string.Pattern("^[A-Z2-7]{26}$")])Age=make_type(int,"Age",[numeric.Minimum(0),numeric.Maximum(150)])Username=make_type(str,"Username",[string.MinLength(4),string.MaxLength(32),string.Pattern("^[A-Za-z][A-Za-z0-9]{2,30}[A-zA-z]$")])Password=make_type(str,"Password",[string.MinLength(8),string.MaxLength(256)])

使用类型

^{pr2}$

例外情况

当类型的输入数据不满足类型约束时,类型抛出ValueErrors。返回所有失败的约束。在

username=Username("123")>>>ValueError:InvalidUsername(123):['Value cannot be less than 4 characters in length','Value must match pattern ^[A-Za-z][A-Za-z0-9]{2,30}[A-zA-z]$']username=Username("1username")>>>ValueError:InvalidUsername(1username):['Value must match pattern ^[A-Za-z][A-Za-z0-9]{2,30}[A-zA-z]$']

类型检查

创建的类型可以与可选的类型检查工具一起使用,以使类型强的协定能够在代码基中传播,从而减少了断言值满足代码中多个级别的约束的需要。在

通常,值将在外部边界(例如传入的web请求或数据库记录)转换为更丰富、受约束的类型,然后在内部使用。在

defregister(id:Id,username:Username,password:Password):...

安装

PyPI安装:

pip install typefactory

路线图

  • 返回所有失败约束的列表的子类ValueError
  • 集装箱类型
  • 用于从类型创建以下内容的函数:
    • 烧瓶URL转换器
    • SqlAlchemy自定义类型
    • 棉花糖田
    • WTForms字段和小部件

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

推荐PyPI第三方库


热门话题
我可以用C++代码使用java代码吗?   java使用JSR303在派生类中提供更具体的约束   java在这个查找唯一路径数算法中我做错了什么?   java如何为2个不同的服务提供商使用2个不同的SSL证书?   java在Gridview上绘制文本   java使用连接for循环构建字符串名   java StringBuilder拆分无法处理某些文件   java事件关注EditText   Java Web Start“找不到URL的缓存资源”   java程序从命令行运行的速度比在Eclipse中慢   java为什么HttpServletRequest会截断#字符上的url输入?   java自定义折叠工具栏平滑标题大小调整   使用Mockito对安卓 java中调用另一个静态函数的函数进行单元测试   http在java客户机中使用cachecontrol头   java如何使用。是否使用Delimiter从输入文件中排除标点符号和数字?   使用上下文作为参数/参数的java   java更有效地从Jar中提取文件   java为多个JButton提供相同的actionListener