另一个python api模式通过输入注释进行处理;轻巧、简单、强大。

pyapischema的Python项目详细描述


APISchema

另一个python api模式通过输入注释进行处理;轻巧、简单、强大。

开始

使用pip install pyapischema安装(我目前在pypi上声明apischema名称)。 按照下面的示例使用它

示例

简单示例:

importjsonimportuuidfromdataclassesimportdataclassfromtypingimportIterator,Sequencefromapischema.dataimportfrom_data,to_datafromapischema.modelimportModelfromapischema.schemaimportbuild_schemafromapischema.validatorimportError,validateclassUUID(Model[str],uuid.UUID):pass@dataclassclassMyModel:id:UUIDelts:Sequence[int]check_sum:int@validate("elts","check_sum")defelts_sum(self)->Iterator[Error]:ifsum(self.elts)!=self.check_sum:yield"check_sum doesn't match elts"data=json.load(...)# type: ignore# data = {"id": str(uuid4()), "elts": [1, 2], "check_sum": 3} my_model=from_data(MyModel,data,camel_case=False)data2=to_data(MyModel,my_model,camel_case=False)openapi=build_schema(MyModel,camel_case=False)

稍微复杂一点

from__future__importannotationsfromdataclassesimportdataclass,fieldfromtypingimportList,TypeVar,Union,Iterator,Genericimportpytestfromapischema.dataimportfrom_datafromapischema.modelimportModelfromapischema.validationimportValidationErrorfromapischema.validatorimportError,validateT=TypeVar("T")classA(Model[Union[T,List[T]]],List[T]):@classmethoddeffrom_model(cls,obj:Union[T,List[T]])->A:ifisinstance(obj,list):returnA(obj)else:returnA([obj])defto_model(self)->Union[T,List[T]]:returnself[0]iflen(self)==1elselist(self)@validatedefno_consecutive_duplicates(self)->Iterator[Error]:iflen(self)==0:returncur=self[0]foriinrange(1,len(self)):ifcur==self[i]:yieldf"duplicate elt {cur} in position {i}"cur=self[i]@dataclassclassB(Generic[T]):a:A[T]=field(default_factory=A)deftest():print()print(from_data(B,{}))print(from_data(B[int],{}))print(from_data(B[int],{"a":0}))print(from_data(B[int],{"a":[1,2]}))withpytest.raises(ValidationError)aserr:print(from_data(B[int],{"a":[1,2,2]}))print(err.value)withpytest.raises(ValidationError)aserr:print(from_data(B[str],{"a":["",0,1]}))print(err.value)

使用spec

fromdataclassesimportdataclassfromapischema.dataimportfrom_data,to_datafromapischema.fieldimportfieldfromapischema.modelimportModelfromapischema.schemaimportSchema,build_schemafromapischema.specimportNumSpec,SpecClassclassShortString(Model[str],SpecClass,str):max_length=10@dataclassclassA:positive:int=field(spec=NumSpec(min=0))short_string:ShortString=ShortString("")deftest():# data = json.load(...)data={"positive":1,"shortString":"ok"}a=from_data(A,data)data2=to_data(A,a)print(data2)openapi=build_schema(A)print(to_data(Schema,openapi))

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

推荐PyPI第三方库


热门话题
java我能在这个程序中更好地使用内存吗?   为什么我的Java while循环迭代了一半   java IntelliJ IDEA不在构建时复制资源   socket仅在Java TCP服务器输出上检查客户端断开连接   java游戏物理摩擦   java片段onClick调用方法   symja数学分析器中无法识别java Abs[x]   java在使用泛型时创建二进制搜索树类的实例?   java在外键约束表上的添加和删除   语法java表达式的含义,如果有条件   java创建内联对象并作为参数传递   是否有相当于Redis排序集(zset)的Java数据结构   java找不到适合的方法(无参数)   音频文件操作给定字节帧的音量Java   Eclipse4不以JavaWebStart启动   java如何使用org在JSON对象中获取嵌套的键元素。json?   java与Jackson的反序列化:“org.codehaus.Jackson.map.JsonMappingException:无法反序列化[projectname]的实例。”   字符串的Java正则表达式   spring集成上的java检测缺火指令