为什么会提出这个问题呢?笔者在开发过程中发现遇到这种情况的case还是很多,我说一个场景看看大家有没有遇到过: 数据我们还是用上节的
{
"persion_info_list": [],
"count": 128,
"book": {
"1": {
"book_name": "zg",
"book_price": 66
},
"2": {
"book_name": "zhongwu",
"book_price": 88
}
}
}
场景: 接口传入参数后,通过我们后端的一系列的逻辑判断后最终输出的数据如上述结构,细心的同学应该能发现 persion_info_list 节点下是一个空列表。 我们试想一下是否会出现这种情况呢?太常见了,我解释一下当我们后端经过查询逻辑判断后发现没有满足 persion_info_list 需要添加的节点数据 那自然就会返回一个空的列表,当然还有一些情况是本来是可以返回正常的数据结构的 但是由于种种原因就是没有返回 这时就会返回空列表,相对请求接口的调用方来讲是比较友好的处理方式。
问题: 类似 persion_info_list 这种节点下可能有数据也可能没有数据的这中情况是如何处理呢? 在 fastapi 中处理这个问题是使用 Optional 关键词处理,具体的处理实例如下:
from typing import Any, Dict, List, Optional
from pydantic import BaseModel, Field
class Book(BaseModel):
book_name: str = Field(...,description="书名")
book_price: str = Field(...,description="价格")
class Person(BaseModule):
name: str = Field("haishiniu",description="用户名")
age: int = Field(18,description="年龄")
sex: str = Field(...,description="性别")
class ResponseData(BaseModule):
persion_info_list: Optional[List[Person]] = Field([],description="用户信息")
count: int = Field(...,description="数量")
book: Dict[str,Book] = Field({},description="书籍信息")
一般情况下,我们是输入的参数是一个或多个输出的参数是一个,但有时候确实需要输出多个参数,那这种的情况下 fastapi 是如何处理的呢?我们通过代码来看一下
from typing import Any, Coroutine, Dict, List, Optional, Tuple
@app.get("/info")
async def info(req: GetRequest) -> Tuple[ResponseData,str]:
# 逻辑处理 这里我直接是用的现成的数据,具体逻辑填充可以依据具体逻辑进行替换
response_data = {
"persion_info_list":[
{
"name": "zhihui",
"age": 12,
"sex": "F"
}
],
"count": 128,
"book":{
"1":{
"book_name":"zg",
"book_price": 66
}
}
}
return ResponseData(**response_data), "hello,word"
通过代码我们可以看到: 输出多个数据是通过 Tuple 结构来控制的 返回的是一个元组类型。
我们再来回顾一下上节提到的一个思考题目,如何去拆解这个数据结构做module化呢?我们先再次请出上节给出的数据结构,
response_data = {
"persion_info_list":[
{
"name": "haishiniu",
"age": 13,
"sex": "M"
},
{
"name": "zhihui",
"age": 12,
"sex": "F"
}
],
"count": 128,
"book":{
"1":{
"book_name":"zg",
"book_price": 66
},
"2": {
"book_name":"zhongwu",
"book_price": 88
}
}
}
我们看一下我图中圈出来的结构,是否能发现或者有些什么思考,其实这些复杂的数据结构都是我们最常见的基础数据结构组合而成的,我们开始学习一门新的语言的时候也是从字符串、列表、字典、元组等开始的,你看其实很多复杂的东西就是由这些简单的“积木”搭建而成的。
我总结一下合理组织module的有效步骤: 1.整理出要输出的最复杂情况下的数据结构 2.基于1 进行按照数字、字符串、字典、列表 等进行拆分 3.划清楚包含与被包含的结构关系 4.基于业务、基于接口的变更频率 拆分出合理的父子关系 5.组合起这一组父子关系的结构
通过以上几个步骤我相信你也可以拆分出优秀的数据结构。我再贴一下我上节的 module 组织结构大家再品品
from typing import Any, Dict, List, Optional
from pydantic import BaseModel, Field
class Book(BaseModel):
book_name: str = Field(...,description="书名")
book_price: str = Field(...,description="价格")
class Person(BaseModule):
name: str = Field("haishiniu",description="用户名")
age: int = Field(18,description="年龄")
sex: str = Field(...,description="性别")
class ResponseData(BaseModule):
persion_info_list: Optional[List[Person]] = Field([],description="用户信息")
count: int = Field(...,description="数量")
book: Dict[str,Book] = Field({},description="书籍信息")
我们对今天的内容做简单总结: 1.我们通过两个案例向大家展示了常见的使用中的问题 2.解答了上节一个重要的思考题目
本部分通过三小结的内容为大家阐述了: 1.什么是 module 化 2.为何使用 module 化 3.如何使用 module 化 4.遇到常见问题的处理方法
到此为止,我们已经分享完了关于 module 常用的知识点,满足日常开发工作是完全可以的,若还想深入的了解关于 module 的相关知识可以私信我。
本文分享自 python编程从入门到实践 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有