gqylpy-datastruct


Namegqylpy-datastruct JSON
Version 3.0 PyPI version JSON
download
home_pagehttp://gqylpy.com
Summary创建一张蓝图来规划好程序需要的数据结构,并在之后使用该蓝图去校验到来的数据是否如期。
upload_time2023-06-10 05:57:46
maintainer
docs_urlNone
author竹永康
requires_python>=3.8, <4
licenseApache 2.0
keywords
VCS
bugtrack_url
requirements gqylpy_exception
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [<img alt="LOGO" src="http://www.gqylpy.com/static/img/favicon.ico" height="21" width="21"/>](http://www.gqylpy.com)
[![Release](https://img.shields.io/github/release/gqylpy/gqylpy-datastruct.svg?style=flat-square")](https://github.com/gqylpy/gqylpy-datastruct/releases/latest)
[![Python Versions](https://img.shields.io/pypi/pyversions/gqylpy_datastruct)](https://pypi.org/project/gqylpy_datastruct)
[![License](https://img.shields.io/pypi/l/gqylpy_datastruct)](https://github.com/gqylpy/gqylpy-datastruct/blob/master/LICENSE)
[![Downloads](https://pepy.tech/badge/gqylpy_datastruct)](https://pepy.tech/project/gqylpy_datastruct)

# gqylpy-datastruct

> 创建一张蓝图来规划好程序需要的数据结构,并在之后使用该蓝图去校验到来的数据是否如期。

_这是一个雏形。_

<kbd>pip3 install gqylpy_datastruct</kbd>

```python
from gqylpy_datastruct import DataStruct

datastruct = DataStruct({'name': {type: str}})
err = datastruct.verify({'name': 'Alpha'})
```

`gqylpy_datastruct` 对外提供了一个类 `DataStruct`,在获得 `DataStruct` 实例时传入蓝图,并在之后调用实例的 `verify`
方法时传入数据,若数据与蓝图不符,将返回(或抛出)错误信息。我们提供了一个
[完整的示例](https://github.com/gqylpy/gqylpy-datastruct/blob/master/test.py)
,运用了该框架的大部分功能,阅读此文档必看此示例。

在获得 `DataStruct` 实例时传入蓝图,同时会校验蓝图,根据蓝图中定义 `key` 的顺序,从前往后,由浅入深进行校验,蓝图
`{a: {b: {c: ...}}, d: {e: ...}}` 的校验顺序是 `a` `a.b` `a.b.c` `d` `d.e`。校验后将蓝图存入属性 
`blueprint`,否则将在检查到第一个错误后立即抛出异常。

在之后调用实例的 `verify` 方法时传入数据,此时开始校验数据。校验过程是递归的,以蓝图作为递归主体,根据蓝图中定义 `key`
的顺序,从前往后,由浅入深从数据中取值。若 `key` 在数据中不存在,并且没有定义任何取值方法和默认值或定义的取值方法未取到值,并且未声明 `key`
是可选的,将立即返回 `DataNotFoundError`。取值后开始调用校验方法,按如下列出校验方法的前后顺序执行,全部校验通过最后执行回调
`callback`,否则将在检查到第一个错误后立即终止校验并返回错误信息。

> __取值方法__
> 
> <kbd>`option`</kbd>  
> 从命令行选项中取值并更新到数据中。指定一个选项用 `"--password"`,指定多个选项用
`("-p", "--password", ...)`。若未取到值则不做处理。优先级高于取值方法 `env` 和默认值 `default`。
> 
> <kbd>`option_bool`</kbd>  
> 检索命令行中有无指定的选项而更新数据中的值为 `True` 或 `False`,它是 `option` 的扩展,优先级同 `option`。`option`
和 `option_bool` 不可同时定义,否则将抛出 `BlueprintStructureError`。
> 
> <kbd>`env`</kbd>  
> 从环境变量中取值并更新到数据中。若未取到值则不做处理,优先级低于其它取值方法,高于默认值。

> __默认值__
> 
> <kbd>`default`</kbd>  
> 若 `key` 在数据中不存在,将创建 `key` 并用之为 `value`。

> __可选参数__
> 
> <kbd>`params`</kbd>  
> 使用元祖或列表指定一个或多个可选参数,可选的参数如下。  
> `optional`: 声明 `key` 是可选的,若 `key` 在数据中不存在,则跳过校验。  
> `delete_none`: 若值是 `None`,则跳过校验,并将其键值对从数据中删除。  
> `delete_empty`: 若值是空的,则跳过校验,并将其键值对从数据中删除。这里的空包括:`None`,`...`,`""`,以及任何长度等于0的容器。  
> `ignore_none`: 若值是 `None`,则跳过校验。优先级低于 `delete_none` 和 `delete_empty`。  
> `ignore_empty`: 若值是空的,则跳过校验。优先级低于 `delete_none` 和 `delete_empty`。  

> __校验方法__
> 
> <kbd>`delete_if_in`</kbd>  
> 使用元祖或列表指定一个或多个不希望得到的值,若传入的值位于其中,则跳过校验,并将其键值对从数据中删除。
> 
> <kbd>`ignore_if_in`</kbd>  
> 使用元祖或列表指定一个或多个不需要校验的值,若传入的值位于其中,则跳过校验。优先级低于 `delete_if_in`。
>
> <kbd>`type`</kbd>  
> 指定一个类,若值不是这个类的实例并且也不是这个类的子类的实例,将返回 `DataTypeError`。其内部调用 `isinstance` 
方法,可使用元组或列表指定多个类。可指定的类有 `[int, float, bytes, str, tuple, list, set, frozenset, dict, bool, NoneType, 
> datetime.date, datetime.time, datetime.datetime, decimal.Decimal]`。校验方法 `type`
的定义是针对内置的基础的大众所熟知的类型进行校验,若要校验其它类型,可编写校验函数并传给校验方法 `verify`。
> 
> <kbd>`coerce`</kbd>  
> 转换值的类型,可转换为 `[int, float, bytes, str, tuple, list, set, dict, bool]`。若类型无法被转换,将返回 
> `DataCoerceError`。若要转换为其它类型,可编写回调函数并传给回调 `callback`。
> 
> <kbd>`enum`</kbd>  
> 枚举,列出一个或多个值,只能在给定的范围内选择一个值,否则将返回 `DataEnumError`。`enum` 的灵感来源于 MySQL 中的枚举类型。
> 
> <kbd>`set`</kbd>  
> 集合,列出至少两个值,只能在给定的范围内选择一个或多个值,否则将返回 
`DataSetError`。选择值时必须使用列表或元组,若只选择一个值,可直接传入,它会在校验通过后被套上列表。`set` 的灵感来源于 MySQL 中的集合类型。
> 
> <kbd>`verify`</kbd>  
> 使用正则或函数校验数据。可以是一个正则表达式字符串、`re.Pattern` 的实例、可调用对象、可调用对象的路径字符串。正则校验调用 
> `search` 方法,校验函数需要一个参数用于接收数据。若校验失败将返回 
> `DataVerifyError`。可使用列表或元组定义多个校验,使用列表定义的多个校验将以 `or` 的关系执行,元组则 
> `and`。校验方法 `verify` 将在下个版本拆分为 `regex` 和 `validator`,分别对应正则校验和函数校验。

> __回调__
> 
> <kbd>`callback`</kbd>  
> 指定一个回调函数,将在校验通过后执行,回调函数需要一个参数用于接收数据,并在执行完毕后将其返回值更新到数据中。

> __关键字__
> 
> <kbd>`branch`</kbd>  
> 蓝图关键字,当数据内层是一个字典时,用 `branch` 连接。
> 
> <kbd>`items`</kbd>  
> 蓝图关键字,当数据内层是一个列表时,用 `items` 连接。

我们提供了一个 [完整的示例](https://github.com/gqylpy/gqylpy-datastruct/blob/master/test.py)
,运用了该框架的大部分功能,学习此框架必看此示例。

            

Raw data

            {
    "_id": null,
    "home_page": "http://gqylpy.com",
    "name": "gqylpy-datastruct",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.8, <4",
    "maintainer_email": "",
    "keywords": "",
    "author": "\u7af9\u6c38\u5eb7",
    "author_email": "<gqylpy@outlook.com>",
    "download_url": "",
    "platform": null,
    "description": "[<img alt=\"LOGO\" src=\"http://www.gqylpy.com/static/img/favicon.ico\" height=\"21\" width=\"21\"/>](http://www.gqylpy.com)\n[![Release](https://img.shields.io/github/release/gqylpy/gqylpy-datastruct.svg?style=flat-square\")](https://github.com/gqylpy/gqylpy-datastruct/releases/latest)\n[![Python Versions](https://img.shields.io/pypi/pyversions/gqylpy_datastruct)](https://pypi.org/project/gqylpy_datastruct)\n[![License](https://img.shields.io/pypi/l/gqylpy_datastruct)](https://github.com/gqylpy/gqylpy-datastruct/blob/master/LICENSE)\n[![Downloads](https://pepy.tech/badge/gqylpy_datastruct)](https://pepy.tech/project/gqylpy_datastruct)\n\n# gqylpy-datastruct\n\n> \u521b\u5efa\u4e00\u5f20\u84dd\u56fe\u6765\u89c4\u5212\u597d\u7a0b\u5e8f\u9700\u8981\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5e76\u5728\u4e4b\u540e\u4f7f\u7528\u8be5\u84dd\u56fe\u53bb\u6821\u9a8c\u5230\u6765\u7684\u6570\u636e\u662f\u5426\u5982\u671f\u3002\n\n_\u8fd9\u662f\u4e00\u4e2a\u96cf\u5f62\u3002_\n\n<kbd>pip3 install gqylpy_datastruct</kbd>\n\n```python\nfrom gqylpy_datastruct import DataStruct\n\ndatastruct = DataStruct({'name': {type: str}})\nerr = datastruct.verify({'name': 'Alpha'})\n```\n\n`gqylpy_datastruct` \u5bf9\u5916\u63d0\u4f9b\u4e86\u4e00\u4e2a\u7c7b `DataStruct`\uff0c\u5728\u83b7\u5f97 `DataStruct` \u5b9e\u4f8b\u65f6\u4f20\u5165\u84dd\u56fe\uff0c\u5e76\u5728\u4e4b\u540e\u8c03\u7528\u5b9e\u4f8b\u7684 `verify`\n\u65b9\u6cd5\u65f6\u4f20\u5165\u6570\u636e\uff0c\u82e5\u6570\u636e\u4e0e\u84dd\u56fe\u4e0d\u7b26\uff0c\u5c06\u8fd4\u56de\uff08\u6216\u629b\u51fa\uff09\u9519\u8bef\u4fe1\u606f\u3002\u6211\u4eec\u63d0\u4f9b\u4e86\u4e00\u4e2a\n[\u5b8c\u6574\u7684\u793a\u4f8b](https://github.com/gqylpy/gqylpy-datastruct/blob/master/test.py)\n\uff0c\u8fd0\u7528\u4e86\u8be5\u6846\u67b6\u7684\u5927\u90e8\u5206\u529f\u80fd\uff0c\u9605\u8bfb\u6b64\u6587\u6863\u5fc5\u770b\u6b64\u793a\u4f8b\u3002\n\n\u5728\u83b7\u5f97 `DataStruct` \u5b9e\u4f8b\u65f6\u4f20\u5165\u84dd\u56fe\uff0c\u540c\u65f6\u4f1a\u6821\u9a8c\u84dd\u56fe\uff0c\u6839\u636e\u84dd\u56fe\u4e2d\u5b9a\u4e49 `key` \u7684\u987a\u5e8f\uff0c\u4ece\u524d\u5f80\u540e\uff0c\u7531\u6d45\u5165\u6df1\u8fdb\u884c\u6821\u9a8c\uff0c\u84dd\u56fe\n`{a: {b: {c: ...}}, d: {e: ...}}` \u7684\u6821\u9a8c\u987a\u5e8f\u662f `a` `a.b` `a.b.c` `d` `d.e`\u3002\u6821\u9a8c\u540e\u5c06\u84dd\u56fe\u5b58\u5165\u5c5e\u6027 \n`blueprint`\uff0c\u5426\u5219\u5c06\u5728\u68c0\u67e5\u5230\u7b2c\u4e00\u4e2a\u9519\u8bef\u540e\u7acb\u5373\u629b\u51fa\u5f02\u5e38\u3002\n\n\u5728\u4e4b\u540e\u8c03\u7528\u5b9e\u4f8b\u7684 `verify` \u65b9\u6cd5\u65f6\u4f20\u5165\u6570\u636e\uff0c\u6b64\u65f6\u5f00\u59cb\u6821\u9a8c\u6570\u636e\u3002\u6821\u9a8c\u8fc7\u7a0b\u662f\u9012\u5f52\u7684\uff0c\u4ee5\u84dd\u56fe\u4f5c\u4e3a\u9012\u5f52\u4e3b\u4f53\uff0c\u6839\u636e\u84dd\u56fe\u4e2d\u5b9a\u4e49 `key`\n\u7684\u987a\u5e8f\uff0c\u4ece\u524d\u5f80\u540e\uff0c\u7531\u6d45\u5165\u6df1\u4ece\u6570\u636e\u4e2d\u53d6\u503c\u3002\u82e5 `key` \u5728\u6570\u636e\u4e2d\u4e0d\u5b58\u5728\uff0c\u5e76\u4e14\u6ca1\u6709\u5b9a\u4e49\u4efb\u4f55\u53d6\u503c\u65b9\u6cd5\u548c\u9ed8\u8ba4\u503c\u6216\u5b9a\u4e49\u7684\u53d6\u503c\u65b9\u6cd5\u672a\u53d6\u5230\u503c\uff0c\u5e76\u4e14\u672a\u58f0\u660e `key`\n\u662f\u53ef\u9009\u7684\uff0c\u5c06\u7acb\u5373\u8fd4\u56de `DataNotFoundError`\u3002\u53d6\u503c\u540e\u5f00\u59cb\u8c03\u7528\u6821\u9a8c\u65b9\u6cd5\uff0c\u6309\u5982\u4e0b\u5217\u51fa\u6821\u9a8c\u65b9\u6cd5\u7684\u524d\u540e\u987a\u5e8f\u6267\u884c\uff0c\u5168\u90e8\u6821\u9a8c\u901a\u8fc7\u6700\u540e\u6267\u884c\u56de\u8c03\n`callback`\uff0c\u5426\u5219\u5c06\u5728\u68c0\u67e5\u5230\u7b2c\u4e00\u4e2a\u9519\u8bef\u540e\u7acb\u5373\u7ec8\u6b62\u6821\u9a8c\u5e76\u8fd4\u56de\u9519\u8bef\u4fe1\u606f\u3002\n\n> __\u53d6\u503c\u65b9\u6cd5__\n> \n> <kbd>`option`</kbd>  \n> \u4ece\u547d\u4ee4\u884c\u9009\u9879\u4e2d\u53d6\u503c\u5e76\u66f4\u65b0\u5230\u6570\u636e\u4e2d\u3002\u6307\u5b9a\u4e00\u4e2a\u9009\u9879\u7528 `\"--password\"`\uff0c\u6307\u5b9a\u591a\u4e2a\u9009\u9879\u7528\n`(\"-p\", \"--password\", ...)`\u3002\u82e5\u672a\u53d6\u5230\u503c\u5219\u4e0d\u505a\u5904\u7406\u3002\u4f18\u5148\u7ea7\u9ad8\u4e8e\u53d6\u503c\u65b9\u6cd5 `env` \u548c\u9ed8\u8ba4\u503c `default`\u3002\n> \n> <kbd>`option_bool`</kbd>  \n> \u68c0\u7d22\u547d\u4ee4\u884c\u4e2d\u6709\u65e0\u6307\u5b9a\u7684\u9009\u9879\u800c\u66f4\u65b0\u6570\u636e\u4e2d\u7684\u503c\u4e3a `True` \u6216 `False`\uff0c\u5b83\u662f `option` \u7684\u6269\u5c55\uff0c\u4f18\u5148\u7ea7\u540c `option`\u3002`option`\n\u548c `option_bool` \u4e0d\u53ef\u540c\u65f6\u5b9a\u4e49\uff0c\u5426\u5219\u5c06\u629b\u51fa `BlueprintStructureError`\u3002\n> \n> <kbd>`env`</kbd>  \n> \u4ece\u73af\u5883\u53d8\u91cf\u4e2d\u53d6\u503c\u5e76\u66f4\u65b0\u5230\u6570\u636e\u4e2d\u3002\u82e5\u672a\u53d6\u5230\u503c\u5219\u4e0d\u505a\u5904\u7406\uff0c\u4f18\u5148\u7ea7\u4f4e\u4e8e\u5176\u5b83\u53d6\u503c\u65b9\u6cd5\uff0c\u9ad8\u4e8e\u9ed8\u8ba4\u503c\u3002\n\n> __\u9ed8\u8ba4\u503c__\n> \n> <kbd>`default`</kbd>  \n> \u82e5 `key` \u5728\u6570\u636e\u4e2d\u4e0d\u5b58\u5728\uff0c\u5c06\u521b\u5efa `key` \u5e76\u7528\u4e4b\u4e3a `value`\u3002\n\n> __\u53ef\u9009\u53c2\u6570__\n> \n> <kbd>`params`</kbd>  \n> \u4f7f\u7528\u5143\u7956\u6216\u5217\u8868\u6307\u5b9a\u4e00\u4e2a\u6216\u591a\u4e2a\u53ef\u9009\u53c2\u6570\uff0c\u53ef\u9009\u7684\u53c2\u6570\u5982\u4e0b\u3002  \n> `optional`: \u58f0\u660e `key` \u662f\u53ef\u9009\u7684\uff0c\u82e5 `key` \u5728\u6570\u636e\u4e2d\u4e0d\u5b58\u5728\uff0c\u5219\u8df3\u8fc7\u6821\u9a8c\u3002  \n> `delete_none`: \u82e5\u503c\u662f `None`\uff0c\u5219\u8df3\u8fc7\u6821\u9a8c\uff0c\u5e76\u5c06\u5176\u952e\u503c\u5bf9\u4ece\u6570\u636e\u4e2d\u5220\u9664\u3002  \n> `delete_empty`: \u82e5\u503c\u662f\u7a7a\u7684\uff0c\u5219\u8df3\u8fc7\u6821\u9a8c\uff0c\u5e76\u5c06\u5176\u952e\u503c\u5bf9\u4ece\u6570\u636e\u4e2d\u5220\u9664\u3002\u8fd9\u91cc\u7684\u7a7a\u5305\u62ec\uff1a`None`\uff0c`...`\uff0c`\"\"`\uff0c\u4ee5\u53ca\u4efb\u4f55\u957f\u5ea6\u7b49\u4e8e0\u7684\u5bb9\u5668\u3002  \n> `ignore_none`: \u82e5\u503c\u662f `None`\uff0c\u5219\u8df3\u8fc7\u6821\u9a8c\u3002\u4f18\u5148\u7ea7\u4f4e\u4e8e `delete_none` \u548c `delete_empty`\u3002  \n> `ignore_empty`: \u82e5\u503c\u662f\u7a7a\u7684\uff0c\u5219\u8df3\u8fc7\u6821\u9a8c\u3002\u4f18\u5148\u7ea7\u4f4e\u4e8e `delete_none` \u548c `delete_empty`\u3002  \n\n> __\u6821\u9a8c\u65b9\u6cd5__\n> \n> <kbd>`delete_if_in`</kbd>  \n> \u4f7f\u7528\u5143\u7956\u6216\u5217\u8868\u6307\u5b9a\u4e00\u4e2a\u6216\u591a\u4e2a\u4e0d\u5e0c\u671b\u5f97\u5230\u7684\u503c\uff0c\u82e5\u4f20\u5165\u7684\u503c\u4f4d\u4e8e\u5176\u4e2d\uff0c\u5219\u8df3\u8fc7\u6821\u9a8c\uff0c\u5e76\u5c06\u5176\u952e\u503c\u5bf9\u4ece\u6570\u636e\u4e2d\u5220\u9664\u3002\n> \n> <kbd>`ignore_if_in`</kbd>  \n> \u4f7f\u7528\u5143\u7956\u6216\u5217\u8868\u6307\u5b9a\u4e00\u4e2a\u6216\u591a\u4e2a\u4e0d\u9700\u8981\u6821\u9a8c\u7684\u503c\uff0c\u82e5\u4f20\u5165\u7684\u503c\u4f4d\u4e8e\u5176\u4e2d\uff0c\u5219\u8df3\u8fc7\u6821\u9a8c\u3002\u4f18\u5148\u7ea7\u4f4e\u4e8e `delete_if_in`\u3002\n>\n> <kbd>`type`</kbd>  \n> \u6307\u5b9a\u4e00\u4e2a\u7c7b\uff0c\u82e5\u503c\u4e0d\u662f\u8fd9\u4e2a\u7c7b\u7684\u5b9e\u4f8b\u5e76\u4e14\u4e5f\u4e0d\u662f\u8fd9\u4e2a\u7c7b\u7684\u5b50\u7c7b\u7684\u5b9e\u4f8b\uff0c\u5c06\u8fd4\u56de `DataTypeError`\u3002\u5176\u5185\u90e8\u8c03\u7528 `isinstance` \n\u65b9\u6cd5\uff0c\u53ef\u4f7f\u7528\u5143\u7ec4\u6216\u5217\u8868\u6307\u5b9a\u591a\u4e2a\u7c7b\u3002\u53ef\u6307\u5b9a\u7684\u7c7b\u6709 `[int, float, bytes, str, tuple, list, set, frozenset, dict, bool, NoneType, \n> datetime.date, datetime.time, datetime.datetime, decimal.Decimal]`\u3002\u6821\u9a8c\u65b9\u6cd5 `type`\n\u7684\u5b9a\u4e49\u662f\u9488\u5bf9\u5185\u7f6e\u7684\u57fa\u7840\u7684\u5927\u4f17\u6240\u719f\u77e5\u7684\u7c7b\u578b\u8fdb\u884c\u6821\u9a8c\uff0c\u82e5\u8981\u6821\u9a8c\u5176\u5b83\u7c7b\u578b\uff0c\u53ef\u7f16\u5199\u6821\u9a8c\u51fd\u6570\u5e76\u4f20\u7ed9\u6821\u9a8c\u65b9\u6cd5 `verify`\u3002\n> \n> <kbd>`coerce`</kbd>  \n> \u8f6c\u6362\u503c\u7684\u7c7b\u578b\uff0c\u53ef\u8f6c\u6362\u4e3a `[int, float, bytes, str, tuple, list, set, dict, bool]`\u3002\u82e5\u7c7b\u578b\u65e0\u6cd5\u88ab\u8f6c\u6362\uff0c\u5c06\u8fd4\u56de \n> `DataCoerceError`\u3002\u82e5\u8981\u8f6c\u6362\u4e3a\u5176\u5b83\u7c7b\u578b\uff0c\u53ef\u7f16\u5199\u56de\u8c03\u51fd\u6570\u5e76\u4f20\u7ed9\u56de\u8c03 `callback`\u3002\n> \n> <kbd>`enum`</kbd>  \n> \u679a\u4e3e\uff0c\u5217\u51fa\u4e00\u4e2a\u6216\u591a\u4e2a\u503c\uff0c\u53ea\u80fd\u5728\u7ed9\u5b9a\u7684\u8303\u56f4\u5185\u9009\u62e9\u4e00\u4e2a\u503c\uff0c\u5426\u5219\u5c06\u8fd4\u56de `DataEnumError`\u3002`enum` \u7684\u7075\u611f\u6765\u6e90\u4e8e MySQL \u4e2d\u7684\u679a\u4e3e\u7c7b\u578b\u3002\n> \n> <kbd>`set`</kbd>  \n> \u96c6\u5408\uff0c\u5217\u51fa\u81f3\u5c11\u4e24\u4e2a\u503c\uff0c\u53ea\u80fd\u5728\u7ed9\u5b9a\u7684\u8303\u56f4\u5185\u9009\u62e9\u4e00\u4e2a\u6216\u591a\u4e2a\u503c\uff0c\u5426\u5219\u5c06\u8fd4\u56de \n`DataSetError`\u3002\u9009\u62e9\u503c\u65f6\u5fc5\u987b\u4f7f\u7528\u5217\u8868\u6216\u5143\u7ec4\uff0c\u82e5\u53ea\u9009\u62e9\u4e00\u4e2a\u503c\uff0c\u53ef\u76f4\u63a5\u4f20\u5165\uff0c\u5b83\u4f1a\u5728\u6821\u9a8c\u901a\u8fc7\u540e\u88ab\u5957\u4e0a\u5217\u8868\u3002`set` \u7684\u7075\u611f\u6765\u6e90\u4e8e MySQL \u4e2d\u7684\u96c6\u5408\u7c7b\u578b\u3002\n> \n> <kbd>`verify`</kbd>  \n> \u4f7f\u7528\u6b63\u5219\u6216\u51fd\u6570\u6821\u9a8c\u6570\u636e\u3002\u53ef\u4ee5\u662f\u4e00\u4e2a\u6b63\u5219\u8868\u8fbe\u5f0f\u5b57\u7b26\u4e32\u3001`re.Pattern` \u7684\u5b9e\u4f8b\u3001\u53ef\u8c03\u7528\u5bf9\u8c61\u3001\u53ef\u8c03\u7528\u5bf9\u8c61\u7684\u8def\u5f84\u5b57\u7b26\u4e32\u3002\u6b63\u5219\u6821\u9a8c\u8c03\u7528 \n> `search` \u65b9\u6cd5\uff0c\u6821\u9a8c\u51fd\u6570\u9700\u8981\u4e00\u4e2a\u53c2\u6570\u7528\u4e8e\u63a5\u6536\u6570\u636e\u3002\u82e5\u6821\u9a8c\u5931\u8d25\u5c06\u8fd4\u56de \n> `DataVerifyError`\u3002\u53ef\u4f7f\u7528\u5217\u8868\u6216\u5143\u7ec4\u5b9a\u4e49\u591a\u4e2a\u6821\u9a8c\uff0c\u4f7f\u7528\u5217\u8868\u5b9a\u4e49\u7684\u591a\u4e2a\u6821\u9a8c\u5c06\u4ee5 `or` \u7684\u5173\u7cfb\u6267\u884c\uff0c\u5143\u7ec4\u5219 \n> `and`\u3002\u6821\u9a8c\u65b9\u6cd5 `verify` \u5c06\u5728\u4e0b\u4e2a\u7248\u672c\u62c6\u5206\u4e3a `regex` \u548c `validator`\uff0c\u5206\u522b\u5bf9\u5e94\u6b63\u5219\u6821\u9a8c\u548c\u51fd\u6570\u6821\u9a8c\u3002\n\n> __\u56de\u8c03__\n> \n> <kbd>`callback`</kbd>  \n> \u6307\u5b9a\u4e00\u4e2a\u56de\u8c03\u51fd\u6570\uff0c\u5c06\u5728\u6821\u9a8c\u901a\u8fc7\u540e\u6267\u884c\uff0c\u56de\u8c03\u51fd\u6570\u9700\u8981\u4e00\u4e2a\u53c2\u6570\u7528\u4e8e\u63a5\u6536\u6570\u636e\uff0c\u5e76\u5728\u6267\u884c\u5b8c\u6bd5\u540e\u5c06\u5176\u8fd4\u56de\u503c\u66f4\u65b0\u5230\u6570\u636e\u4e2d\u3002\n\n> __\u5173\u952e\u5b57__\n> \n> <kbd>`branch`</kbd>  \n> \u84dd\u56fe\u5173\u952e\u5b57\uff0c\u5f53\u6570\u636e\u5185\u5c42\u662f\u4e00\u4e2a\u5b57\u5178\u65f6\uff0c\u7528 `branch` \u8fde\u63a5\u3002\n> \n> <kbd>`items`</kbd>  \n> \u84dd\u56fe\u5173\u952e\u5b57\uff0c\u5f53\u6570\u636e\u5185\u5c42\u662f\u4e00\u4e2a\u5217\u8868\u65f6\uff0c\u7528 `items` \u8fde\u63a5\u3002\n\n\u6211\u4eec\u63d0\u4f9b\u4e86\u4e00\u4e2a [\u5b8c\u6574\u7684\u793a\u4f8b](https://github.com/gqylpy/gqylpy-datastruct/blob/master/test.py)\n\uff0c\u8fd0\u7528\u4e86\u8be5\u6846\u67b6\u7684\u5927\u90e8\u5206\u529f\u80fd\uff0c\u5b66\u4e60\u6b64\u6846\u67b6\u5fc5\u770b\u6b64\u793a\u4f8b\u3002\n",
    "bugtrack_url": null,
    "license": "Apache 2.0",
    "summary": "\u521b\u5efa\u4e00\u5f20\u84dd\u56fe\u6765\u89c4\u5212\u597d\u7a0b\u5e8f\u9700\u8981\u7684\u6570\u636e\u7ed3\u6784\uff0c\u5e76\u5728\u4e4b\u540e\u4f7f\u7528\u8be5\u84dd\u56fe\u53bb\u6821\u9a8c\u5230\u6765\u7684\u6570\u636e\u662f\u5426\u5982\u671f\u3002",
    "version": "3.0",
    "project_urls": {
        "Homepage": "http://gqylpy.com",
        "Source": "https://github.com/gqylpy/gqylpy-datastruct"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5faa076a97487ae8c0bb55785fce2352363afcee52fb15068ce9b8abe6eebcc5",
                "md5": "1a50647fb1aafc58c332866913c58ace",
                "sha256": "28fba1e2d1c658441b3f71520559c535abe688adb2ded863bc010b44be8b9f23"
            },
            "downloads": -1,
            "filename": "gqylpy_datastruct-3.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "1a50647fb1aafc58c332866913c58ace",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8, <4",
            "size": 17091,
            "upload_time": "2023-06-10T05:57:46",
            "upload_time_iso_8601": "2023-06-10T05:57:46.542494Z",
            "url": "https://files.pythonhosted.org/packages/5f/aa/076a97487ae8c0bb55785fce2352363afcee52fb15068ce9b8abe6eebcc5/gqylpy_datastruct-3.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-06-10 05:57:46",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "gqylpy",
    "github_project": "gqylpy-datastruct",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "gqylpy_exception",
            "specs": [
                [
                    ">=",
                    "2.0.4"
                ]
            ]
        }
    ],
    "lcname": "gqylpy-datastruct"
}
        
Elapsed time: 0.08002s