苗条帅气的验证库
good的Python项目详细描述
良好
苗条而美观的验证库。
核心功能:
- 简单
- 可定制
- 支持嵌套模型验证
- 错误路径(包含错误的字段)
- 用户友好的错误消息
- 国际化!
- 健壮性:每秒10000次验证
- python 2.7、3.3+兼容
- 100%记录和单元测试
灵感来源于令人惊叹的alecthomas/voluptuous和100%兼容。 整个内部结构都经过了重新设计,以达到可读性和健壮性。是的,文档现在已经详尽无遗:)
翻拍的基本原理是让它模块化,有一个很小的核心,其他一切都建立在这个基础上, 确保所有错误消息都是用户友好的开箱即用,并调整性能。
目录
替代品数量急剧下降
尽管善是以肉欲为原型的,而且是高度兼容的, 仍然有一些差异肯定会破坏您的项目。
如果您还没有准备好进行这样的更改--很好。voluptuous
是解决方案:
兼容层,用于从voluptuous 0.8.5切换
100%兼容。
这是一个通过所有有趣的单元测试的替换,因此应该工作得很好。 下面是如何使用它
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before
包括所有功能,绝对兼容,除了错误信息文本, 变得更加方便用户:)
迁移步骤:
- 用
good.voluptuous替换
,记住不同之处。voluptuous
导入- 运行应用程序测试并查看其运行方式
- 一个模块接一个模块,用"好的"替换"好的"。有趣的
还要注意仍然存在的细微差异:
必需的
和额外的
的设置不是由嵌入映射继承的。如果顶级架构定义了
required=false
,则嵌入映射仍将具有默认的required=true
! 与extra
相同不同的错误信息文本,更容易理解:)
对于被拒绝的额外映射密钥,引发
无效的而不是
多重有效的
(请参见extra
)
祝你好运!:)< >
模式
验证方案。
模式是一种python结构,其中的节点与相应的值进行模式匹配。 它充分利用了python的灵活性,允许您匹配值、类型、数据结构等等。
当一个模式被创建时,它被编译成一个可调用的函数来进行验证,因此它不需要 每次都要分析架构。
一旦定义了模式,就可以通过调用它来触发验证:
fromgoodimportSchemaschema=Schema({'a':str})# Testschema({'a':'i am a valid string'})
存在以下规则:
文字:通过直接比较(相等检查)验证纯值:
Schema(1)(1)#-> 1Schema(1)(2)#-> Invalid: Invalid value: expected 1, got 2
类型:类型schema生成一个严格的
类型(v)==模式
检查输入值:Schema(int)(1)#-> 1Schema(int)(True)#-> Invalid: Wrong type: expected Integer number, got BooleanSchema(int)('1')#-> Invalid: Wrong type: expected Integer number, got Binary String
对于python2,basestring有一个异常:它不会进行严格的类型检查,而是进行
isinstance()
有关放松的
isinstance()
检查,请参见验证程序。枚举: python 3.4枚举S 或后端口的enum34
测试输入值是否为有效的枚举值
fromenumimportEnumclassColors(Enum):RED=0xFF0000GREEN=0x00FF00BLUE=0x0000FFschema=Schema(Colors)schema(0xFF0000)#-> <Colors.RED: 0xFF0000>schema(Colors.RED)#-> <Colors.RED: 0xFF0000>schema(123)#-> Invalid: Invalid Colors value, expected Colors, got 123
输出始终是提供的枚举类型值的实例。
可调用:应用于值,结果用作最终值。
在失败的情况下,可调用函数应该会引发
无效的
错误,但是一些常见的错误类型是 自动转换:请参见可调用函数。此外,允许验证器将值转换为所需的表单。 例如,返回一个可调用函数,该函数将输入值转换为
int
defCoerceInt(v):# naive Coerce(int) implementationreturnint(v)Schema(CoerceInt)(1)#-> 1Schema(CoerceInt)('1')#-> 1Schema(CoerceInt)('a')#-> Invalid: invalid literal for int(): expected CoerceInt(), got a
架构
:架构可以包含子架构:sub_schema=Schema(int)schema=Schema([None,sub_schema])schema([None,1,2])#-> [None, 1, 2]schema([None,'1'])#-> Invalid: invalid value
由于
schema
是可调用的,只需调用它即可透明地进行验证:)
此外,以下类型的实例在编译阶段转换为可调用的:
iterables(
list
,tuple
,set
,自定义iterables):iterable被视为一组有效值, 将输入中的每个值与架构中的每个值进行比较。
为了使输入有效,它需要具有相同的iterable类型,并且 值在架构中应至少有一个匹配的值。
schema=Schema([1,2,3])# List of valid valuesschema([1,2,2])#-> [1, 2, 2]schema([1,2,4])#-> Invalid: Invalid value @ [2]: expected List[1|2|3], got 4schema((1,2,2))#-> Invalid: Wrong value type: expected List, got Tuple
iterable中的每个值也是一个模式,验证需要 输入值的每个成员都与模式的任何匹配。 因此,iterable是为iterable的每个成员定义或验证规则的一种方法:
Schema([# All values should be# .. int ..int,# .. or a string, casted to int ..lambdav:int(v)])([1,2,'3'])#-> [ 1, 2, 3 ]
此示例的工作方式如下:
验证输入值是否具有匹配的类型:
列表
在本例中对于列表中的每个成员,测试架构中是否有匹配的值。
例如,对于值
1
--int
匹配(立即instanceof()
检查)。 但是,对于value'3'
--int
失败,但是callable成功地做到了这一点,没有错误, 并转换值。因为列表是有序的,所以使用第一个没有失败的模式。
映射(
dict
,自定义映射):输入映射中的每个键值对都根据相应的模式对进行验证:
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before
0验证时,键和值都是模式,允许使用嵌套模式和有趣的验证规则。 例如,让我们使用验证器来匹配特定的密钥:
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before
1工作原理如下:
- 测试输入是否具有匹配的类型(
dict
) - 对于输入映射中的每个键,将从架构中选择匹配的键
- 使用架构中的相应值验证输入值。
此外,某些键可以标记为
Required
和Optional
。 默认行为是需要所有键,但可以通过提供默认密钥=可选的
模式参数。最后,映射不允许任何额外的键(架构中未定义的键)。若要更改此设置,请提供
extra_keys=allow
到schema
构造函数。请注意,
默认密钥
和额外密钥
设置不会传播到子架构,仅应用于 到顶层映射。如果需要,用另一个schema()
包装子模式并提供设置,或者 显式使用标记。- 测试输入是否具有匹配的类型(
schema
可以做得更多!
额外的逻辑是通过标记和验证程序实现的,
以下章节将对其进行说明。可调用项
最后,在使用自定义可调用函数进行验证时,需要考虑以下事项:
抛出错误。
如果callable抛出
invalid
异常,则它将按原样用于它提供的所有丰富信息。 架构足够聪明,可以填充大多数参数(请参见invalid.enrich
), 因此,使用自定义消息就足够了,而且可能需要设置一个人性化的预期的
字段。
此外,特定的错误类型会自动包装到
invalid
中:断言错误
,类型错误
,值错误
。 schema尽力做到最好,但是这样的消息对于用户来说可能是不明确的。 因此,在创建自定义验证器时总是会引发有意义的错误。 不过,这也为使用python类型转换和验证程序(如lambda v:int(v)
)提供了可能性, 因为它们中的大多数都抛出typeerror
或valueerror
命名。
如果提供的可调用项未指定
无效。应为
预期值, 改为使用可调用的名称。 例如,在报告的错误中,
def initify(v):pass
变成'initify()'
。如果需要在可调用对象上使用自定义名称——请在可调用对象上设置
name
属性。 这对类最有效,但是函数也可以接受name
属性。为了方便起见,可在可调用项上使用装饰符。 指定名称并覆盖验证程序失败时使用的错误消息。
信号。
可调用的可能会决定该值非常无效,因此应该从经过清理的输出中删除该值。 在这种情况下,可调用函数应该引发
good.schema.signals.removeValue
这由
remove()
标记使用,但也可以被其他可调用项利用。
优先级
每种模式类型都有一个优先级(源), 定义映射架构中匹配键的序列:
文字具有最高优先级
类型的优先级低于文本,因此模式可以为单个键定义特定的规则, 然后通过类型匹配声明一般规则:
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before
2可调用、可访问、映射——优先级较低。
此外,标记具有单独的优先级,
它可以是比文本更高的值(remove()
标记)或低于可调用的值(extra
标记)。
创建模式
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before3
从给定的架构定义创建编译的架构对象。
在引擎盖下,它使用schema compiler
:如果感兴趣,请参阅源代码。
参数:
投掷:
架构错误
:架构编译错误
正在验证
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before4
如果有一个模式,则可以通过调用输入值上的模式来验证用户输入。
调用时,架构将返回经过清理的值,或引发异常。
参数:
值
:输入要验证的值
返回:无
清除值
投掷:
好。多个值无效
:多个值的验证错误。请参见multipleinvalid
好。无效
:单个值的验证错误。请参见无效
错误
来源:good/schema/errors.py rel="nofollow">good/schema/errors.py
当验证用户输入时,收集所有错误并抛出这些错误 在整个输入值被验证之后。这确保您可以同时报告所有的错误。
对于简单的模式,例如schema(int),只有一个错误可用:例如,错误的值类型。 在这种情况下,会引发错误。
但是,对于具有嵌入结构等的复杂架构,可能会发生多个错误:
然后,[multipleinvalid
]被报告。
所有错误都可以在顶层找到:
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before5
无效
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before6
单个值的验证错误。
保证此异常包含对用户有意义的文本值。
参数:
消息
:验证错误消息。预期值
:预期值:验证程序预期值的相关信息。如果验证器没有指定它——则使用验证器的名称。
提供的
:提供的值:有关用户实际提供的值的信息如果验证器没有指定它——输入值被类型转换为字符串并存储在这里。
路径
:错误值的路径。例如,如果在['a'].b[1]处遇到无效值,则路径=['a','b',1]。
验证器
:失败的验证器:架构项**info
:验证器可能提供的自定义值。没有内置的验证器使用它。
无效的.enrich()
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before7
用附加信息充实此错误。
这对invalid和multipleinvalid都有效(由于invalid
是iterable):
在后一种情况下,默认值将应用于所有收集到的错误。
指定的参数仅设置在无效的
错误上,这些错误在属性上没有任何值。
一个排除是路径
:如果提供,它将被预先设置为invalid.path
。
当使用多个不同模式验证整个输入时,此功能尤其有用:
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before8
这在验证容器中的值时使用。
参数:
应为
:无效。应为默认值提供的
:无效。提供的默认值路径
:前缀,以前置到无效的.path验证器
:无效。验证器默认值
返回:无效多重有效
多重有效
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before9
多个值的验证错误。
当schema
报告多个错误(例如多个字典键)时,会引发此错误。
multipleInvalid
具有与 invalid相同的属性ODE < < /A>
但这些值取自列表中的第一个错误。
此外,它还具有errors
属性,该属性是由架构收集的invalid
错误的列表。
列表保证是简单的:例如,不会有multipleinvalid
的底层层次结构。
注意,无效
和多重有效
都是可接受的,这允许在奇点中处理它们:
fromgoodimportSchemaschema=Schema({'a':str})# Testschema({'a':'i am a valid string'})0
在本例中,我们为用户创建一个映射到错误字符串的路径字典(作为字符串)。
参数:
错误
:报告的错误。如果它包含
multipleinvalid
错误,则列表将递归展开 因此,所有这些都保证是"invalid" rel="nofollow">的实例。
标记
标记是一个代理类,它包装一些模式。
立即,示例是:
fromgoodimportSchemaschema=Schema({'a':str})# Testschema({'a':'i am a valid string'})1
这样,标有required()
的键如果没有提供值,将报告错误。
通常,标记"修饰"映射键,但其中一些键可以是"独立的":
fromgoodimportSchemaschema=Schema({'a':str})# Testschema({'a':'i am a valid string'})2
每个标记都有自己独特的行为,因为没有任何内容被硬编码到核心模式中。 继续阅读以了解标记如何工作。
必需的
fromgoodimportSchemaschema=Schema({'a':str})# Testschema({'a':'i am a valid string'})3
required(key)
用于修饰映射键,因此指定这些键必须始终存在于
输入映射。
编译时,使用默认键
作为默认标记:
fromgoodimportSchemaschema=Schema({'a':str})# Testschema({'a':'i am a valid string'})4
请记住,映射键也是模式,需要
将希望始终具有匹配项:
fromgoodimportSchemaschema=Schema({'a':str})# Testschema({'a':'i am a valid string'})5
此外,所需的标记具有特殊的行为,允许设置键
如果未提供密钥,则设置为默认值。有关
默认值
的文档中的更多详细信息
参数:
可选
fromgoodimportSchemaschema=Schema({'a':str})# Testschema({'a':'i am a valid string'})6
可选(键)
有争议的是指定不需要映射键。
只有当aschema
具有default\u keys=required
:
然后,它用required()
装饰所有键,除非键已经用某些标记装饰。
optional()
步骤:这些键已被修饰,因此没有用required()包装。
因此,它只用于防止schema
将required()
放在键上。
在所有其他意义上,它绝对没有特殊的行为。
因此,可能会丢失可选键,但如果提供了可选键,则其值必须与值架构匹配。
示例:用作默认键
fromgoodimportSchemaschema=Schema({'a':str})# Testschema({'a':'i am a valid string'})7
示例:不需要用于标记特定键:
fromgoodimportSchemaschema=Schema({'a':str})# Testschema({'a':'i am a valid string'})8
参数:
删除
fromgoodimportSchemaschema=Schema({'a':str})# Testschema({'a':'i am a valid string'})9
remove(key)
标记用于声明如果遇到密钥,
应在不验证值的情况下删除。
remove
具有最高优先级,因此它比架构中的其他内容都要优先操作。
示例:
Schema(1)(1)#-> 1Schema(1)(2)#-> Invalid: Invalid value: expected 1, got 20
但是,对值使用remove()
更为自然。
请记住,在这种情况下,'name'
将变为required()
,
如果没有用optional()
装饰:
Schema(1)(1)#-> 1Schema(1)(2)#-> Invalid: Invalid value: expected 1, got 21
奖励:remove()
也可用于iterables中:
Schema(1)(1)#-> 1Schema(1)(2)#-> Invalid: Invalid value: expected 1, got 22
参数:
拒绝
Schema(1)(1)#-> 1Schema(1)(2)#-> Invalid: Invalid value: expected 1, got 23
拒绝(键)
标记用于报告每次与输入中的内容匹配时,都会出现错误。
它的优先级比大多数其他模式都低,因此只会发生拒绝 如果没有其他架构与此值匹配。
示例:
Schema(1)(1)#-> 1Schema(1)(2)#-> Invalid: Invalid value: expected 1, got 24
参数:
允许
Schema(1)(1)#-> 1Schema(1)(2)#-> Invalid: Invalid value: expected 1, got 25
允许(键)
是禁止操作的标记,从不抱怨任何事情。
设计用于extra
参数:
额外的
Schema(1)(1)#-> 1Schema(1)(2)#-> Invalid: Invalid value: expected 1, got 26
extra
是一个catch all标记,用于定义架构中未定义的映射键的行为。
它具有最低优先级,并将其函数委托给其值,该值可以是架构或其他标记。
如果不带参数,则使用identity函数lambda x:x
编译,该函数是一个catch all:
它匹配任何值。与最低优先级一起,extra
将只捕获与其他值不匹配的值。
每个映射都隐式地有一个extra
,并且extra\u键
参数控制默认行为。
带有extra:<;schema>;
的示例:
Schema(1)(1)#-> 1Schema(1)(2)#-> Invalid: Invalid value: expected 1, got 27
带有 使用 带有 参数: 它具有绝对最低的优先级,低于 这就打开了在多个字段上定义规则的可能性。
此功能由组验证程序利用。 例如,我们要求映射不超过3个键: 在本例中,对每个输入字典都执行 请注意,此标记映射到的架构不能替换映射对象,但它可以改变给定的映射。 参数: 这里列出的所有验证器都继承自定义标准接口的 收集各种帮助程序以更改验证过程。 指定提供的映射应验证对象。 它使用相同的映射验证规则,但使用属性: 在内部,它验证对象的 这将继承架构的默认必需/额外键行为。
要覆盖,请使用 参数: 如果发生验证错误,则重写包装架构报告的错误消息。 在验证时,如果架构抛出 其他一些错误类型被转换为extra:reject的示例
Schema(1)(1)#-> 1Schema(1)(2)#-> Invalid: Invalid value: expected 1, got 2
8
extra:remove的示例:无提示地放弃所有额外值:
Schema(1)(1)#-> 1Schema(1)(2)#-> Invalid: Invalid value: expected 1, got 2
9
extra:allow的示例:allow any extra values:
Schema(int)(1)#-> 1Schema(int)(True)#-> Invalid: Wrong type: expected Integer number, got BooleanSchema(int)('1')#-> Invalid: Wrong type: expected Integer number, got Binary String
0
整个
Schema(int)(1)#-> 1Schema(int)(True)#-> Invalid: Wrong type: expected Integer number, got BooleanSchema(int)('1')#-> Invalid: Wrong type: expected Integer number, got Binary String
1
整个
是一个方便的标记,它使用作为值提供的验证器验证整个映射。extra
,因此它从不匹配任何键,但仍执行到
验证映射本身。Schema(int)(1)#-> 1Schema(int)(True)#-> Invalid: Wrong type: expected Integer number, got BooleanSchema(int)('1')#-> Invalid: Wrong type: expected Integer number, got Binary String
2
entire
,并神奇地调用它映射到的模式。
maxkeys(n)
模式是一个验证器,如果字典太大,它就会抱怨字典的大小。
模式
捕获由其引发的断言错误
并将其转换为无效
验证工具
validatorbase
。
目前,无论它是可调用的、类还是validatorbase的子类都没有区别,
但在未来,它可能会获得特殊功能。助手
对象
Schema(int)(1)#-> 1Schema(int)(True)#-> Invalid: Wrong type: expected Integer number, got BooleanSchema(int)('1')#-> Invalid: Wrong type: expected Integer number, got Binary String
3
Schema(int)(1)#-> 1Schema(int)(True)#-> Invalid: Wrong type: expected Integer number, got BooleanSchema(int)('1')#-> Invalid: Wrong type: expected Integer number, got Binary String
4
\uu dict\u
:因此,类属性被排除在验证之外。
验证在包装器类的帮助下执行,包装器类将对象属性代理为映射键,
然后模式将其验证为映射。optional()
和extra
标记。模式
:对象模式,作为映射给定cls
:需要特定类的实例。如果无
,则允许所有类。消息
Schema(int)(1)#-> 1Schema(int)(True)#-> Invalid: Wrong type: expected Integer number, got BooleanSchema(int)('1')#-> Invalid: Wrong type: expected Integer number, got Binary String
5
invalid
--消息将被msg
覆盖无效的
:请参见有关架构调用的说明
Schema(int)(1)#-> 1Schema(int)(True)#-> Invalid: Wrong type: expected Integer number, got BooleanSchema(int)('1')#-> Invalid: Wrong type: expected Integer number, got Binary String6
参数:
模式
:修改错误的包装模式消息
:要使用的错误消息,而不是基础架构报告的错误消息
测试
Schema(int)(1)#-> 1Schema(int)(True)#-> Invalid: Wrong type: expected Integer number, got BooleanSchema(int)('1')#-> Invalid: Wrong type: expected Integer number, got Binary String7
使用提供的函数测试该值,希望它不会抛出错误。
如果没有抛出错误——该值是有效的,并且使用原始输入值。 如果抛出任何错误,则认为该值无效。
这对于丢弃包装验证程序生成的转换尤其有用:
Schema(int)(1)#-> 1Schema(int)(True)#-> Invalid: Wrong type: expected Integer number, got BooleanSchema(int)('1')#-> Invalid: Wrong type: expected Integer number, got Binary String8
参数:
乐趣
:可调用以使用或验证函数测试值。请注意,这将不适用于可变输入值,因为它们已被修改到位!
消息
Schema(int)(1)#-> 1Schema(int)(True)#-> Invalid: Wrong type: expected Integer number, got BooleanSchema(int)('1')#-> Invalid: Wrong type: expected Integer number, got Binary String9
适用于可调用的便利装饰符
fromenumimportEnumclassColors(Enum):RED=0xFF0000GREEN=0x00FF00BLUE=0x0000FFschema=Schema(Colors)schema(0xFF0000)#-> <Colors.RED: 0xFF0000>schema(Colors.RED)#-> <Colors.RED: 0xFF0000>schema(123)#-> Invalid: Invalid Colors value, expected Colors, got 1230
参数:
消息
:要改用的错误消息名称
:也重写架构名称。参见
返回:callable
decorator
名称
fromenumimportEnumclassColors(Enum):RED=0xFF0000GREEN=0x00FF00BLUE=0x0000FFschema=Schema(Colors)schema(0xFF0000)#-> <Colors.RED: 0xFF0000>schema(Colors.RED)#-> <Colors.RED: 0xFF0000>schema(123)#-> Invalid: Invalid Colors value, expected Colors, got 1231
在可调用的验证器上设置名称。
当使用lambdas填充无效字段时,对于用户友好的报告非常有用
fromenumimportEnumclassColors(Enum):RED=0xFF0000GREEN=0x00FF00BLUE=0x0000FFschema=Schema(Colors)schema(0xFF0000)#-> <Colors.RED: 0xFF0000>schema(Colors.RED)#-> <Colors.RED: 0xFF0000>schema(123)#-> Invalid: Invalid Colors value, expected Colors, got 1232
注意,它只对lambdas有用,因为函数名在以下情况下可用: 请参见有关架构可调用项的说明
参数:
名称
:要在可调用验证器上分配的名称验证器
:验证器可调用。如果没有提供,则返回一个decorator:fromenumimportEnumclassColors(Enum):RED=0xFF0000GREEN=0x00FF00BLUE=0x0000FFschema=Schema(Colors)schema(0xFF0000)#-> <Colors.RED: 0xFF0000>schema(Colors.RED)#-> <Colors.RED: 0xFF0000>schema(123)#-> Invalid: Invalid Colors value, expected Colors, got 123
3
返回:可调用
同一验证器可调用
真理
fromenumimportEnumclassColors(Enum):RED=0xFF0000GREEN=0x00FF00BLUE=0x0000FFschema=Schema(Colors)schema(0xFF0000)#-> <Colors.RED: 0xFF0000>schema(Colors.RED)#-> <Colors.RED: 0xFF0000>schema(123)#-> Invalid: Invalid Colors value, expected Colors, got 1234
适用于可调用项的便利装饰符
fromenumimportEnumclassColors(Enum):RED=0xFF0000GREEN=0x00FF00BLUE=0x0000FFschema=Schema(Colors)schema(0xFF0000)#-> <Colors.RED: 0xFF0000>schema(Colors.RED)#-> <Colors.RED: 0xFF0000>schema(123)#-> Invalid: Invalid Colors value, expected Colors, got 1235
参数:
消息
:验证错误消息需要
:需要值字符串表示,或无
从包装的可调用函数中获取它
返回:callable
decorator
谓词
可能
fromenumimportEnumclassColors(Enum):RED=0xFF0000GREEN=0x00FF00BLUE=0x0000FFschema=Schema(Colors)schema(0xFF0000)#-> <Colors.RED: 0xFF0000>schema(Colors.RED)#-> <Colors.RED: 0xFF0000>schema(123)#-> Invalid: Invalid Colors value, expected Colors, got 1236
验证该值是否与给定架构匹配或是否为"无"。
这支持可为空的值,并为它们提供了良好的表示形式。
fromenumimportEnumclassColors(Enum):RED=0xFF0000GREEN=0x00FF00BLUE=0x0000FFschema=Schema(Colors)schema(0xFF0000)#-> <Colors.RED: 0xFF0000>schema(Colors.RED)#-> <Colors.RED: 0xFF0000>schema(123)#-> Invalid: Invalid Colors value, expected Colors, got 1237
请注意,它还具有类似于的默认行为
-like行为
初始化丢失的required()
键:
fromenumimportEnumclassColors(Enum):RED=0xFF0000GREEN=0x00FF00BLUE=0x0000FFschema=Schema(Colors)schema(0xFF0000)#-> <Colors.RED: 0xFF0000>schema(Colors.RED)#-> <Colors.RED: 0xFF0000>schema(123)#-> Invalid: Invalid Colors value, expected Colors, got 1238
参数:
模式
:提供值的模式无
:空值文本
任意
fromenumimportEnumclassColors(Enum):RED=0xFF0000GREEN=0x00FF00BLUE=0x0000FFschema=Schema(Colors)schema(0xFF0000)#-> <Colors.RED: 0xFF0000>schema(Colors.RED)#-> <Colors.RED: 0xFF0000>schema(123)#-> Invalid: Invalid Colors value, expected Colors, got 1239
按顺序尝试提供的架构,并使用第一个成功的架构。
这是或条件谓词:任何模式都应该匹配。 如果两个架构都不匹配,则会报告错误。
defCoerceInt(v):# naive Coerce(int) implementationreturnint(v)Schema(CoerceInt)(1)#-> 1Schema(CoerceInt)('1')#-> 1Schema(CoerceInt)('a')#-> Invalid: invalid literal for int(): expected CoerceInt(), got a0
参数:
*模式
:要尝试的模式列表。
全部
defCoerceInt(v):# naive Coerce(int) implementationreturnint(v)Schema(CoerceInt)(1)#-> 1Schema(CoerceInt)('1')#-> 1Schema(CoerceInt)('a')#-> Invalid: invalid literal for int(): expected CoerceInt(), got a1
值必须通过用谓词包装的所有验证器。
这是和条件谓词:所有模式都应按顺序匹配,
它实际上是一个验证器的组合:all(f,g)(值)=g(f(值))
defCoerceInt(v):# naive Coerce(int) implementationreturnint(v)Schema(CoerceInt)(1)#-> 1Schema(CoerceInt)('1')#-> 1Schema(CoerceInt)('a')#-> Invalid: invalid literal for int(): expected CoerceInt(), got a2
参数:
*模式
:要应用的模式列表。
两者都不是
defCoerceInt(v):# naive Coerce(int) implementationreturnint(v)Schema(CoerceInt)(1)#-> 1Schema(CoerceInt)('1')#-> 1Schema(CoerceInt)('a')#-> Invalid: invalid literal for int(): expected CoerceInt(), got a3
值不能与任何架构匹配。
这是not条件谓词:如果每个架构都引发了错误,则认为值有效。
defCoerceInt(v):# naive Coerce(int) implementationreturnint(v)Schema(CoerceInt)(1)#-> 1Schema(CoerceInt)('1')#-> 1Schema(CoerceInt)('a')#-> Invalid: invalid literal for int(): expected CoerceInt(), got a4
参数:
*架构
:要检查的架构列表。
包含
defCoerceInt(v):# naive Coerce(int) implementationreturnint(v)Schema(CoerceInt)(1)#-> 1Schema(CoerceInt)('1')#-> 1Schema(CoerceInt)('a')#-> Invalid: invalid literal for int(): expected CoerceInt(), got a5
inclusive
验证定义的包含映射键组:
如果提供了其中任何一个,则所有这些都将成为必需的。
这是为了支持映射中的"子结构",只有在一起指定时才有意义。 由于此验证器对整个映射起作用,最好的方法是将其与 标记:
defCoerceInt(v):# naive Coerce(int) implementationreturnint(v)Schema(CoerceInt)(1)#-> 1Schema(CoerceInt)('1')#-> 1Schema(CoerceInt)('a')#-> Invalid: invalid literal for int(): expected CoerceInt(), got a6
注意inclusive
只支持文本。
参数:
*键
:相互包含的键(文本)列表。
独家
defCoerceInt(v):# naive Coerce(int) implementationreturnint(v)Schema(CoerceInt)(1)#-> 1Schema(CoerceInt)('1')#-> 1Schema(CoerceInt)('a')#-> Invalid: invalid literal for int(): expected CoerceInt(), got a7
exclusive
验证定义的映射键的独占组:
如果提供了其中任何一个键,则其余的键都不能使用。
这支持有选择的"子结构":如果用户从其中一个选择字段--
那他就不能利用别人了。
它适用于整个映射,因此最好与entire
标记一起使用。
默认情况下,独占
要求用户选择其中一个选项,
但这可以用作为参数的标记类来覆盖
defCoerceInt(v):# naive Coerce(int) implementationreturnint(v)Schema(CoerceInt)(1)#-> 1Schema(CoerceInt)('1')#-> 1Schema(CoerceInt)('a')#-> Invalid: invalid literal for int(): expected CoerceInt(), got a8
让我们用支持多种身份验证的api演示一下, 但要求用户只选择一个:
defCoerceInt(v):# naive Coerce(int) implementationreturnint(v)Schema(CoerceInt)(1)#-> 1Schema(CoerceInt)('1')#-> 1Schema(CoerceInt)('a')#-> Invalid: invalid literal for int(): expected CoerceInt(), got a9
注意exclusive
只支持文本。
参数:
*键
:互斥键(文本)列表。可以包含标记类, 它定义了当没有提供键时的行为。默认值是
必需的
类型
键入
sub_schema=Schema(int)schema=Schema([None,sub_schema])schema([None,1,2])#-> [None, 1, 2]schema([None,'1'])#-> Invalid: invalid value0
使用isinstance()
检查值是否具有特定类型。
与执行严格检查的模式类型不同,此检查是放松的,接受子类型 同样,
sub_schema=Schema(int)schema=Schema([None,sub_schema])schema([None,1,2])#-> [None, 1, 2]schema([None,'1'])#-> Invalid: invalid value1
参数:
*键入
:要检查实例的类型。如果提供多种类型,则任何一种都可以接受。
强制
sub_schema=Schema(int)schema=Schema([None,sub_schema])schema([None,1,2])#-> [None, 1, 2]schema([None,'1'])#-> Invalid: invalid value2
将值强制为具有提供的可调用类型。
强制
将构造函数应用于输入值,并返回转换为所提供类型的值。
如果构造函数因typeerror
或valueerror
而失败,则该值将被视为无效,并且强制
会抱怨
上面有一条自定义消息。
但是,如果构造函数引发了--错误对象将被用作它。
sub_schema=Schema(int)schema=Schema([None,sub_schema])schema([None,1,2])#-> [None, 1, 2]schema([None,'1'])#-> Invalid: invalid value3
参数:
构造函数
:可调用,用于类型转换输入值
值
输入
sub_schema=Schema(int)schema=Schema([None,sub_schema])schema([None,1,2])#-> [None, 1, 2]schema([None,'1'])#-> Invalid: invalid value4
验证集合中是否有值。
这是一个简单的容器值检查,其中
容器是文本的集合。
与any
相反,它不会将参数编译为模式,
从而获得更好的性能。
sub_schema=Schema(int)schema=Schema([None,sub_schema])schema([None,1,2])#-> [None, 1, 2]schema([None,'1'])#-> Invalid: invalid value5
同样的例子也适用于any
,但速度较慢:-)
参数:
ode>容器:允许值的集合。
除了naive tuple/list/set/dict之外,它还可以是任何在操作中支持
的对象。
长度
sub_schema=Schema(int)schema=Schema([None,sub_schema])schema([None,1,2])#-> [None, 1, 2]schema([None,'1'])#-> Invalid: invalid value6
验证提供的集合的长度是否在特定范围内。
sub_schema=Schema(int)schema=Schema([None,sub_schema])schema([None,1,2])#-> [None, 1, 2]schema([None,'1'])#-> Invalid: invalid value7
由于映射也有长度,因此也可以验证它们:
sub_schema=Schema(int)schema=Schema([None,sub_schema])schema([None,1,2])#-> [None, 1, 2]schema([None,'1'])#-> Invalid: invalid value8
参数:
min
:最小允许长度,或无限制。
max
:最大允许长度,或无限制。
默认值
sub_schema=Schema(int)schema=Schema([None,sub_schema])schema([None,1,2])#-> [None, 1, 2]schema([None,'1'])#-> Invalid: invalid value9
如果未提供值,则将其初始化为默认值。
"not provided"是指none
,因此基本上它用默认值替换none
s
schema=Schema([1,2,3])# List of valid valuesschema([1,2,2])#-> [1, 2, 2]schema([1,2,4])#-> Invalid: Invalid value @ [2]: expected List[1|2|3], got 4schema((1,2,2))#-> Invalid: Wrong value type: expected List, got Tuple0
它对除none
和默认值之外的所有值都引发
无效
:
schema=Schema([1,2,3])# List of valid valuesschema([1,2,2])#-> [1, 2, 2]schema([1,2,4])#-> Invalid: Invalid value @ [2]: expected List[1|2|3], got 4schema((1,2,2))#-> Invalid: Wrong value type: expected List, got Tuple1
此外,默认值
具有内置的必需标记的特殊行为:
如果未提供所需的密钥,则使用默认值创建该密钥:
schema=Schema([1,2,3])# List of valid valuesschema([1,2,2])#-> [1, 2, 2]schema([1,2,4])#-> Invalid: Invalid value @ [2]: expected List[1|2|3], got 4schema((1,2,2))#-> Invalid: Wrong value type: expected List, got Tuple2
参数:
默认值
:要使用的默认值
回退
schema=Schema([1,2,3])# List of valid valuesschema([1,2,2])#-> [1, 2, 2]schema([1,2,4])#-> Invalid: Invalid value @ [2]: expected List[1|2|3], got 4schema((1,2,2))#-> Invalid: Wrong value type: expected List, got Tuple3
始终返回默认值。
工作方式类似于默认值
,但在任何值上都不会失败。
典型的用法是在没有工作的情况下终止链:
schema=Schema([1,2,3])# List of valid valuesschema([1,2,2])#-> [1, 2, 2]schema([1,2,4])#-> Invalid: Invalid value @ [2]: expected List[1|2|3], got 4schema((1,2,2))#-> Invalid: Wrong value type: expected List, got Tuple4
类似于默认值
,它也适用于映射。
在内部,默认值
和回退
通过向架构提供一个未定义的特殊值来工作:
如果模式成功地返回一些值而没有错误——那么它有一个命名为"默认行为",
而这个验证器正好利用了这个特性。
"回退值"可以手动提供,其工作原理完全相同 (因为即使给定了未定义的值模式,值模式也能成功):
schema=Schema([1,2,3])# List of valid valuesschema([1,2,2])#-> [1, 2, 2]schema([1,2,4])#-> Invalid: Invalid value @ [2]: expected List[1|2|3], got 4schema((1,2,2))#-> Invalid: Wrong value type: expected List, got Tuple5
参数:
默认值
:始终返回的值
地图
schema=Schema([1,2,3])# List of valid valuesschema([1,2,2])#-> [1, 2, 2]schema([1,2,4])#-> Invalid: Invalid value @ [2]: expected List[1|2|3], got 4schema((1,2,2))#-> Invalid: Wrong value type: expected List, got Tuple6
转换将名称映射为值的枚举。
支持三种枚举:
映射。
提供了从名称到值的映射, 通过映射键将输入转换为值:
schema=Schema([1,2,3])# List of valid valuesschema([1,2,2])#-> [1, 2, 2]schema([1,2,4])#-> Invalid: Invalid value @ [2]: expected List[1|2|3], got 4schema((1,2,2))#-> Invalid: Wrong value type: expected List, got Tuple
7类。
提供了一个属性(名称)初始化为值的类, 将输入转换为按属性名匹配的值:
schema=Schema([1,2,3])# List of valid valuesschema([1,2,2])#-> [1, 2, 2]schema([1,2,4])#-> Invalid: Invalid value @ [2]: expected List[1|2|3], got 4schema((1,2,2))#-> Invalid: Wrong value type: expected List, got Tuple
8注意,类的所有属性都被使用,除了受保护的(
\u name
)和可调用的属性。EnU.
支持python 3.4枚举 以及后端口的enum34
提供枚举,按名称将输入转换为值。 此外,枚举值可以安全通过:
schema=Schema([1,2,3])# List of valid valuesschema([1,2,2])#-> [1, 2, 2]schema([1,2,4])#-> Invalid: Invalid value @ [2]: expected List[1|2|3], got 4schema((1,2,2))#-> Invalid: Wrong value type: expected List, got Tuple
9请注意,在
mode=map.val
中,它的工作方式与schema(enum)
除了"straignt"模式(按键查找)外,它还支持反向匹配:
- 当
mode=map.key
时,仅转发匹配(按键)--默认值 - 当
mode=map.val
时,只进行反向匹配(按值) - 当
mode=map.both
时,进行双向匹配(先按键,然后按值)
另一个简洁的特性是map
支持in
包含检查,
它与(map(enum value)):in(map(enum value))中的
一起工作得很好
实际进行转换。
Schema([# All values should be# .. int ..int,# .. or a string, casted to int ..lambdav:int(v)])([1,2,'3'])#-> [ 1, 2, 3 ]0
参数:
枚举
:枚举:dict,object,of enum模式
:匹配模式:map.key、map.val、map.both中的一个
布尔型
检查
Schema([# All values should be# .. int ..int,# .. or a string, casted to int ..lambdav:int(v)])([1,2,'3'])#-> [ 1, 2, 3 ]1
使用提供的布尔函数作为验证器,当它是false
Schema([# All values should be# .. int ..int,# .. or a string, casted to int ..lambdav:int(v)])([1,2,'3'])#-> [ 1, 2, 3 ]2
参数:
bValidator
:布尔验证函数消息
:当false时要报告的错误消息
需要
:需要值字符串表示,或无
从包装的可调用函数中获取它
truthy
Schema([# All values should be# .. int ..int,# .. or a string, casted to int ..lambdav:int(v)])([1,2,'3'])#-> [ 1, 2, 3 ]3
断言该值在python意义上是真实的。
在所有"falsy"值上都失败:false
,0
,空集合等。
Schema([# All values should be# .. int ..int,# .. or a string, casted to int ..lambdav:int(v)])([1,2,'3'])#-> [ 1, 2, 3 ]4
错误
Schema([# All values should be# .. int ..int,# .. or a string, casted to int ..lambdav:int(v)])([1,2,'3'])#-> [ 1, 2, 3 ]5
断言该值在python意义上是错误的。
对truthy的补充。
布尔型
Schema([# All values should be# .. int ..int,# .. or a string, casted to int ..lambdav:int(v)])([1,2,'3'])#-> [ 1, 2, 3 ]6
将人类可读的布尔值转换为bool
支持以下值:
无
:假
bool
:直接int
:0
=false
,其他都是true
str
:文本布尔值,与yaml 1.1布尔文本兼容,即:Schema([# All values should be# .. int ..int,# .. or a string, casted to int ..lambdav:int(v)])([1,2,'3'])#-> [ 1, 2, 3 ]
7如果提供了未知的字符串文本,则会引发
invalid
。
示例:
Schema([# All values should be# .. int ..int,# .. or a string, casted to int ..lambdav:int(v)])([1,2,'3'])#-> [ 1, 2, 3 ]8
数字
范围
Schema([# All values should be# .. int ..int,# .. or a string, casted to int ..lambdav:int(v)])([1,2,'3'])#-> [ 1, 2, 3 ]9
验证该值是否在定义的范围(包括)内。 如果没有,则引发错误。
α#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before00
如果无法将该值与数字进行比较,则会引发invalid
。
注意,在python2中,几乎所有内容都可以与数字进行比较,包括字符串、dict和列表!
参数:
min
:最小允许值,或none
不施加限制。max
:最大允许值,或无限制。
夹钳
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before01
将一个值钳制到定义的范围(包括该范围)。
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before02
如果无法将该值与数字进行比较,则会引发invalid
。
注意,在python2中,几乎所有内容都可以与数字进行比较,包括字符串、dict和列表!
参数:
min
:最小允许值,或none
不施加限制。max
:最大允许值,或无限制。
字符串
下
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before03
将提供的字符串强制转换为小写,失败的是输入值不是字符串。
支持二进制和Unicode字符串。
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before04
上部
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before05
将输入字符串转换为大写。
大写
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before06
将输入字符串大写。
标题
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before07
将输入字符串转换为标题大小写
匹配
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before08
根据正则表达式验证输入字符串。
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before09
参数:
模式
:要与之匹配的regexp模式:字符串或编译的模式消息
:错误消息覆盖期望值
:用户期望值的文本表示
更换
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before10
regexp替换。
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before11
参数:
模式
:要与之匹配的regexp模式:字符串或编译的模式repl
:替换模式。支持反向引用,就像在
re
模块。消息
:错误消息覆盖期望值
:用户期望值的文本表示
url
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before12
验证URL,确保它是绝对格式,包括协议。
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before13
参数:
协议
:允许的协议列表。如果用户没有提供协议,则默认使用第一个协议。
电子邮件
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before14
验证值是否为电子邮件地址。
这只是测试"@"符号是否存在,是否由一些字符包围。
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before15
日期
日期时间
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before16
验证输入是否为pythondatetime
支持以下输入值:
日期时间
:传递- string:使用任何指定格式解析字符串 (请参见strptime())
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before17
时区注意事项:
- 如果格式不支持时区,则始终返回naive
datetime
对象(不带tzinfo
)。 - 如果格式支持时区(使用
%z
/%z
), 它返回一个感知对象(带有tzinfo
)。 - 因为python2并不总是支持手动操作。
由于这种解决方法的有限性,对
%z
的支持只有在字符串末尾时才起作用!
结果,"00:00:00"被解析为一个天真的日期时间,"00:00:00+0200"导致感知的日期时间。
如果您的应用程序需要不同的规则,请使用本地化和
astz
:
本地化
参数是要在天真的日期时间上设置的默认时区, 或应用于输入并应返回调整后的日期时间astz
参数是调整awaredatetime到或可调用的时区。
那么一般的配方是:
- 将
本地化
设置为您希望用户输入日期时间的时区(或可调用的时区) - 将
astz
设置为您希望在结果中显示的时区。
这对于优秀的pytz库最有效。
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before18
注意:要避免一些痛苦,请确保始终使用naive日期时间
调整为UTC!
Armin Ronacher在这里解释它
综上所述,验证过程分为三步:
- 解析(仅限字符串)
- 如果是天真的,则应用本地化并使其感知(如果指定了本地化
- 如果知道--应用
astz
来转换它(如果指定了astz
)
参数:
格式
:支持的格式字符串,或一系列可供尝试的格式。本地化
:将天真日期时间
调整到时区,使其感知一个时区对象, 或者一个可调用的,应用于naive日期时间,并应返回一个调整后的值。
只要求天真
日期时间
s。astz
:将aware调整到另一个时区。一个时区对象, 或应用于感知的日期时间并应返回调整后的值的可调用项。
<P>仅调用awaredatetime
s,包括由localize
创建的
日期
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before19
验证输入是否为pythondate
支持以下输入值:
日期
:传递日期时间
:取.date()
部分- 字符串:解析(请参见
datetime
)
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before20
参数:
时间
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before21
验证输入是否为pythontime
支持以下输入值:
时间
:通过datetime
:接受.timetz()
部分- 字符串:解析(请参见
datetime
)
因为时间
会受到时区问题的影响,
确保您已经阅读了datetime
文档的相关部分中的注释。
参数:
文件
isfile
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before22
确认文件存在。
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before23
isdir
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before24
确认目录存在。
路径存在
#from voluptuous import * # no morefromgood.voluptuousimport*# replacement# .. and use it like before25
确认路径存在。