Fastapi 简明教程

FastAPI - Type Hints

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 这样的基本编码环境也表明该函数需要两个参数,但不会指定类型,因为它们尚未声明。

hint1

Python 的新类型提示功能有助于提示用户传递的参数的预期类型。这是通过在参数后添加冒号和数据类型来完成的。我们将重新定义 division() 函数,如下所示 −

hint2

请注意,在调用函数时,Python 会暗示每个要传递的参数的预期类型。但是,这并不能防止 TypeError 在传递不兼容的值时出现。您必须使用 MyPy 等静态类型检查器在运行之前检查兼容性。

就像函数定义中的形式参数一样,可以为函数的返回值提供类型提示。在函数定义语句中的冒号符号之前(函数块开始之后),添加一个箭头 (→) 和类型。

hint3

然而,如前所述,如果将不兼容的值传递给函数或由函数返回,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, and Sequence 。它还包含 UnionOptional 类型。请注意,数据类型标准名称全部小写,而 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}