Python 是一门动态语言, 变量使用前不需要声明, 并且可以指向任何类型的对象; 一方面给开发者带来了便利, 另一方面, 给 IDE 和代码阅读者带来了困惑, 在变量类型未知的情况下, IDE 无法给出补全提示和语法检查
Python 从 3.5 版本开始支持"类型提示"(PEP484), 允许开发者声明变量的类型
类型提示的最大好处是 IDE 可以提供相应类型的补全提示
- 没有类型提示
VSCode 不知道参数的类型, 无法给出补全提示
- 有类型提示时
VSCode 知道是字符串类型, 可以列出字符串的所有方法
使用类型提示
类型提示仅起到提示的功能, 对代码的运行没有影响, 变量的实际类型可以与类型提示不同
类型提示包括: 变量类型, 函数中的参数类型和返回值类型
- 声明变量类型
sep: str
sep = '-'
age: int = 35
ok: bool = True
pi: float = 3.14159
变量可以先声明类型再赋值, 也可以同时声明类型和赋值
- 声明函数的参数和返回值类型
Python 解释器会解析函数的类型提示, 并更新函数对象的 __annotations__ 属性
def get_name(f_name: str, l_name: str, sep: str = '-') -> str:
name = f_name.title() + sep + l_name.title()
return name
class Cat:
def __init__(self, name):
self.name = name
def do(self, content: str) -> str:
return f"{
self.name} do {
content}"
print("get_name type-hints:", get_name.__annotations__)
print("Cat.do type-hints:", Cat.do.__annotations__)
对于带默认值的参数, 将默认值放在类型提示后面
输出:
get_name type-hints: {'f_name': <class 'str'>, 'l_name': <class 'str'>, 'sep': <class 'str'>, 'return': <class 'str'>}
Cat.do type-hints: {'content': <class 'str'>, 'return': <class 'str'>}
可用类型
类型提示除了使用类型本身, 还可以使用类型的字符串
def show(name: 'str', age: 'int') -> 'None':
print("name:", name)
print("age :", age)
容器类型
除了基本类型, 容器类型还可以指定子元素的类型, 这样在使用子元素时, IDE 也能提供代码补全
from typing import Tuple
Vector2D = Tuple[int, int]
def show(line: list[int], dots: Vector2D, info: dict[str, str]):
print('line:', line)
print('dots:', dots)
print('info:', info)
show([1], (2, 3), {
'name': 'Hoss'})
有两种方式指定容器中子元素的类型:
- 直接使用内置的容器类型
例如 list[int]
和 dict[str, str]
, 仅 Python 3.9+ 版本可用
- 借助标准库
typing
例如 Tuple[int, int]
, 用法与上面一致, 只是换成了相应类型的别名
当然还可以把自定义的容器类型赋值给变量, 这个变量用于类型提示