FastAPI - Type 类型提示
FastAPI 广泛使用了 Python 3.5 及更高版本中提供的 Type 提示功能。 事实上,众所周知,Python 是一种动态类型语言。 它也恰好是 Python 的显著特征。 在 Python 代码中,一个变量不需要被声明为属于某个类型,它的类型是由分配给它的瞬时值动态决定的。 Python 的解释器不执行类型检查,因此很容易出现运行时异常。
在下面的示例中,division() 函数定义了两个参数并返回它们的除法,假设参数为数字。
>>> def division(a, b): return a/b >>> division(10, 4) 2.5 >>> division(10, 2.5) 4.0
但是,如果传递给函数的值之一恰好是非数字的,则会导致 TypeError,如下所示 −
>>> division("Python",5) TypeError: unsupported operand type(s) for /: 'str' and 'int'
即使是像 IDLE 这样的基本编码环境,也表明该函数需要两个参数,但不会指定类型,因为它们尚未声明。
Python 的新类型提示功能有助于提示用户要传递的参数的预期类型。 这是通过在参数后添加冒号和数据类型来完成的。 我们将重新定义 division() 函数如下 −
请注意,在调用该函数时,Python 会提示要传递的每个参数的预期类型。 但是,如果传递了不兼容的值,这不会阻止出现 TypeError。 您必须使用静态类型检查器(例如 MyPy)在运行前检查兼容性。
就像函数定义中的形式参数一样,可以为函数的返回值提供类型提示。 在函数定义语句中的冒号之前(功能块开始后)添加一个箭头 (->) 和类型。
但是,如前所述,如果将不兼容的值传递给函数,或由函数返回,Python 会报告 TypeError。 使用 MyPy 静态类型检查器可以检测到此类错误。 首先安装 mypy 包。
pip3 install mypy
将以下代码保存为 typecheck.py
def division(x:int, y:int) -> int: return (x//y) a=division(10,2) print (a) b=division(5,2.5) print (b) c=division("Hello",10) print (c)
使用 mypy 检查此代码是否存在类型错误。
C:\python37>mypy typechk.py typechk.py:7: error: Argument 2 to "division" has incompatible type "float"; expected "int" typechk.py:10: error: Argument 1 to "division" has incompatible type "str"; expected "int" Found 2 errors in 1 file (checked 1 source file)
函数的第二次和第三次调用有错误。 其次,传递给 y 的值是 float,而预期的是 int。 第三,传递给 x 的值是 str,而预期的是 int。 (注意 // 运算符返回整数除法)
所有标准数据类型都可以用作类型提示。 这可以通过全局变量、作为函数参数的变量、内部函数定义等来完成。
x: int = 3 y: float = 3.14 nm: str = 'abc' married: bool = False names: list = ['a', 'b', 'c'] marks: tuple = (10, 20, 30) marklist: dict = {'a': 10, 'b': 20, 'c': 30}
较新版本的 Python(3.5 版以上)标准库中新增了一个 typing 模块。 它为相应的标准集合类型定义特殊类型。typing 模块的类型有List、Tuple、Dict 和Sequence。 它还由 Union 和 Optional 类型组成。 请注意,数据类型的标准名称都是小写的,而 typing 模块中的名称首字母大写。 使用此功能,我们可以询问特定类型的集合。
from typing import List, Tuple, Dict # following line declares a List object of strings. # If violated, mypy shows error cities: List[str] = ['Mumbai', 'Delhi', 'Chennai'] # This is Tuple with three elements respectively # of str, int and float type) employee: Tuple[str, int, float] = ('Ravi', 25, 35000) # Similarly in the following Dict, the object key should be str # and value should be of int type, failing which # static type checker throws error marklist: Dict[str, int] = {'Ravi': 61, 'Anil': 72}