持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
介绍
- 类型提示是Python3.6+版本加入的功能。
- 类型提示就是在定义变量时顺便指定一个类型,比如定义一个
str类型的变量name。 - 类型提示在大型工程项目中非常必要,配合静态检查、减少bug,方便团队协同开发。
- 类型提示的使用非常简单直观。
基本使用
- 编写一个函数:两个形参(字符串类型),一个字符串类型返回值
# 使用方式
get_full_name("john", "doe") # 预期返回值 John Doe
# 实现方式1(无类型提示)
def get_full_name(first_name, last_name):
full_name = first_name.title() + " " + last_name.title()
return full_name
# 实现方式2(类型提示)
def get_full_name(first_name: str, last_name: str) -> str:
full_name = first_name.title() + " " + last_name.title()
return full_name
基本使用:
- 在变量或形参后面加上
:,后面节类型str,就好了 - 返回值使用
->箭头符号后面接返回值类型即可。
通过上面的简单例子可以看到,结合类型提示可以至少有两个好处:
- 在IDE中编写代码时
first_name.title()可以有自动补全功能,及时忘记字符串类型下面有哪些方法,点一下就有提示。 - 可以做类型检查,比如下面代码中
age是int类型,函数内就不能直接使用字符串拼接,需要修改为str(age)再做拼接,否则代码直接报错。
def get_name_with_age(name: str, age: int) -> str:
name_with_age = name + " is this old: " + age
return name_with_age
类型的,如果你定义了函数的返回值,函数实际返回值的类型一定要符合定义的返回值类型。
简单类型
对于简单的基本数据类型,我们可以使用的有
strintfloatboolbytes
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
容器类型
- 对于有容器型变量,比如列表、字典、集合等,我们可以也直接使用
list、dict、set等,但是这样做的缺点是不能提示到内部元素的类型。此时我们一般使用内置模块typing
- 列表:
typing.List,可以定义列表内的元素类型
from typing import List
def process_items(items: List[str]):
for item in items:
print(item)
- 字典:
typing.Dict,可以定义字典的key和value的类型
from typing import Dict
def process_items(goods: Dict[str, float]):
for name, price in goods.items():
print(name, price)
- 元组和集合:
typing.Tuple, typing.Set,可定义元组的个数和类型,定义集合内元素的类型
from typing import Set, Tuple
def process_items(items_t: Tuple[int, int, str], items_s: Set[bytes]):
return items_t, items_s
- 可能存在多个数据类型时可以使用
typing.Union,如下面的num1可以是int也可以是float
from typing import Union
def add(num1: typing.Union[int, float], num2: typing.Union[int, float]):
return num1 + num2
- 可能为空:此时使用
typing.Optional
from typing import Optional
def get_full_name(name: Optional[str]) -> str:
return name or ""
# 或者使用 typing.Union[str, None],即Optional是此时Union的简化使用方式
类作为类型
我们自定通过关键字class定义的类可以作为类实例化对象的类型
class Person:
def __init__(self, name: str):
self.name = name
def get_person_name(one_person: Person) -> str:
return one_person.name
jack = Person("jack")
print(get_person_name(jack))
补充
- 对于嵌套数据类型,我们使用
typing模块是可以支持任意格式的嵌套。 - 使用
typing模块可以定义函数、方法、可调用对象等等任何数据类型。 - Python10以后,对于像容器类型和可能存在多个数据类型的支持更加简单。