Python 3.6+ 版本加入了对”类型提示”的支持。通过声明变量的类型,编辑器和一些工具能给你提供更好的支持。

示例

当我们在使用python写一段代码的时候,如果遇到下面这种情况:

1
2
def funcname(param1,param2):
print(param1.split(''))

如果我们想要对函数传递的某些参数进行一些操作的话,在使用一些内置方法的时候,我们通常会依赖python的联想功能,但是在这种情况下,一切都不管用,因为编辑器根本不知道参数是什么类型,所以更不知道可以做什么操作。就像下面这样:

失败情况

但是,我们加上类型提示之后,一切都会变得不一样。而所谓的类型提示就是告诉编辑器,这到底是一个什么类型的参数,如下:

失败情况

这样我们就能够正确的去实现编辑器的联想功能了。但是….类型提示仅限于此吗?并非如此,类型提示可以帮助我们规范参数类型,自动过滤某些非法参数,防止SQL注入等安全问题。

更多

普通类型

普通类型即我们常见的类型,如:int、float、bool、bytes这些类型使用方式如上,在函数参数处声明使用。

嵌套类型

嵌套类型指该类型内部可以包含其他类型,如常见的 dict、list、set 和 tuple等,这些类型的内部可以拥有其他类型,甚至于这些类型可以相互嵌套,如列表于字典的混合嵌套就是非常常见的情况。

由于嵌套类型在python语言中不能够直接被识别,因此需要导入一个特定的库才可以,即:tying

嵌套类型的使用方式如下:

1
2
3
4
5
from typing import List


def funcname(param: List[str]):
print(param.append(''))

其他嵌套类型以此类推。

以类作为类型提示

通过上面的案例,我们已将能够实现较多的数据类型提示功能了,但是当遇到一些复杂情况的时候,比如需要复杂的数据校验,或者涉及到需要多层嵌套的情况下,以前的简单数据类型已经完全不能够满足需求了,这个时候就需要类的出现了。

对于使用类来作为类型提示,需要引入一个特别的库即:Pydantic。这个库提供了丰富的类型提示的相关帮助,能够帮助开发者实现数据校验、数据限制、嵌套类型识别、密码安全验证、数据库操作模型等等。由于这是一个庞大的知识,我一时半会也阐述不完整,因此我附上两份文档:

https://pydantic-docs.helpmanual.io/

https://blog.csdn.net/swinfans/article/details/89629641

同时附上几个从互联网上找到的几个案例:

配合函数使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pydantic import BaseModel, Field


class Item(BaseModel):
name: str
description: str = Field(None, title="The description of the item", max_length=300)
price: float = Field(..., gt=0, description="The price must be greater than zero")
tax: float = None



async def update_item(item_id: int, item: Item = Body(..., embed=True)):
results = {"item_id": item_id, "item": item}
return results

嵌套类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from enum import Enum
from typing import List, Union
from datetime import date
from pydantic import BaseModel

class Gender(str, Enum):
man = "man"
women = "women"

class Person(BaseModel):
name : str
gender : Gender

class Department(BaseModel):
name : str
lead : Person
cast : List[Person]

class Group(BaseModel):
owner: Person
member_list: List[Person] = []

class Company(BaseModel):
name: str
owner: Union[Person, Group]
regtime: date
department_list: List[Department] = []

数据校验:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from pydantic import BaseModel, ValidationError, validator
from typing import List


class DemoModel(BaseModel):
friends: List[int] = []
books: List[int] = []

# '*' 在这里是匹配任意字段,包含friends,books
@validator('*', pre=True)
def split_str(cls, v):
"""如果传参是字符串,根据逗号切割成list"""
if isinstance(v, str):
return v.split(',')
return v

@validator('books')
def books_greater_then_5(cls, v):
"""判断books数量少于5"""
if len(v) > 5:
raise ValueError('books greater than 5')
return v


a1 = {
"friends": [2, 3, 4],
"books": "3,4,5"
}
d = DemoModel(**a1)
print(d) # friends=[2, 3, 4] books=[3, 4, 5]
print(d.dict()) # {'friends': [2, 3, 4], 'books': [3, 4, 5]}

总结

python提供的类型提示方法能够帮助使用者快速高效的去验证数据参数的合规性与安全性,保障数据传输在高效的同时兼顾安全性能,相比于其他的手动验证方式,这样的方式明显高效更多。也能使得文档具有更强的可读性,帮助开发者理解代码逻辑含义,提高编程效率。