FastAPI从入门到实战(1)——Python类型提示

介绍

  • 类型提示是Python3.6+版本加入的功能;
  • 类型提示就是在定义变量的时候给变量指定一个类型,比如定义一个str类型的变量;
  • 类型提示在工程项目中很重要,配合静态检查、减少bug、方便开发;
  • 类型提示使用简洁…

简单使用

  • 使用方法总结:
  • 在变量或形参后面加上:,后面接类型就行,例如int 、float,就好了;
  • 返回值的类型提示就是在函数后面用箭头->指定;
    eg:
def get_full_name(first_name: str, last_name: str) -> str:
    full_name = first_name.title() + " " + last_name.title()
    return full_name

简单类型

  • int
  • float
  • bool
  • bytes:代表字节串,是一个类型。字符串(str)由多个字符组成,以字符为单位进行操作;字节串(bytes)由多个字节组成,以字节为单位进行操作,由于bytes 保存的就是原始的字节(二进制格式)数据,因此 bytes对象可用于在网络上传输数据,也可用于存储各种二进制格式的文件,比如图片、音乐等文件。
def get_items(item_a: str, item_b: int, item_c: float, item_d: bool, item_e: bytes):
    return item_a, item_b, item_c, item_d, item_d, item_e

嵌套类型

列表

from typing import List

def process_items(items: List[str]):
    for item in items:
        print(item)
        

以:声明变量

输入List作为类型

表示变量items是一个list,并且这个列表里每个元素都是str

元组和集合

from typing import Set, Tuple

def process_items(items_t: Tuple[int, int, str], items_s: Set[bytes]):
    return items_t, items_s

字典

from typing import Dict

def process_items(prices: Dict[str, float]):
    for item_name, item_price in prices.items():
        print(item_name)
        print(item_price)

定义dict的时候,需要传入两个类型,分别声明键和值的类型;

上面代码表示:

变量prices是一个dict,这个dict的所有键都是str类型,所有的值都是float类型。

class Person:
    def __init__(self, name: str):
        self.name = name

def get_person_name(one_person: Person):
    return one_person.name

上面代码就表示one_person是一个Person类型的参数。

联合类型(typing.Union)

联合类型; Union[X, Y] 意味着:要不是 X,要不是 Y。

使用形如 Union[int, str] 的形式来定义一个联合类型。细节如下:

  • 参数必须是类型,而且必须至少有一个参数。
  • 联合类型的联合类型会被展开打平,比如:
Union[Union[int, str], float] == Union[int, str, float]
  • 仅有一个参数的联合类型会坍缩成参数自身,比如:
Union[int] == int  # The constructor actually returns int
  • 多余的参数会被跳过,比如:
Union[int, str, int] == Union[int, str]
  • 在比较联合类型的时候,参数顺序会被忽略,比如:
Union[int, str] == Union[str, int]
  • 你不能继承或者实例化一个联合类型。
  • 你不能写成 Union[X][Y] 。
  • 你可以使用 Optional[X] 作为 Union[X, None] 的缩写。

可选类型(typing.Optional)

Optional[X] 等价于 Union[X, None]

请注意,这与可选参数并非相同的概念。可选参数是一个具有默认值的参数。可选参数的类型注解并不因为它是可选的就需要 Optional 限定符。例如:

def foo(arg: int = 0) -> None:
    ...

另一方面,如果允许显式地传递值 None , 使用 Optional 也是正当的,无论该参数是否是可选的。例如:

def foo(arg: Optional[int] = None) -> None:
    ...

eg:

def foo_v1(a: int, b:int = None):
    if b:
        print(a + b)
    else:
        print("parameter b is a NoneType!")

def foo_v2(a: int, b: Optional[int] = None):
    if b:
        print(a + b)
    else:
        print("parameter b is a NoneType!")

def foo_v3(a: int, b: Union[int, None] = None):
    if b:
        print(a + b)
    else:
        print("parameter b is a NoneType!")

#只传入a位置的实参
foo_v1(2)
foo_v2(2)
foo_v3(2)

# 输出
>>> parameter b is a NoneType!
>>> parameter b is a NoneType!
>>> parameter b is a NoneType!

加不加Optional这个其实没什么区别,python会默认最后一个赋值的形式参数为可选参数,加上Optional这个参数主要是为了增加可读性,毕竟形如“int = None”的形式参数赋值容易引起歧义,也即类型注释已经为整数类型,但是你传入的参数确实None(也即‘NoneType’类型),而添加Optional之后就相当于在int和None之间连接起来,也即默认是None,但是可以传入int类型的值(当然由于python没有强制,虽然注释为int类型,你还是可以传入其他类型)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值