Python 类型提示
Python 3.6+ 版本加入了对"类型提示"的支持。
这些"类型提示"是一种新的语法(在 Python 3.6 版本加入)用来声明一个变量的类型。
通过声明变量的类型,编辑器和一些工具能给你提供更好的支持。
作用
让我们从一个简单的例子开始:
def get_full_name(first_name, last_name):
full_name = first_name.title() + " " + last_name.title()
return full_name
print(get_full_name("john", "doe"))
运行这段程序将输出:
John Doe
这是一个非常简单的程序。现在假设你将从头开始编写这段程序。在某一时刻,你开始定义函数,并且准备好了参数…。现在你需要调用一个"将第一个字母转换为大写形式的方法"。等等,那个方法是什么来着?upper?还是 uppercase?first_uppercase?capitalize?
然后你尝试向程序员老手的朋友——编辑器自动补全寻求帮助。
输入函数的第一个参数 first_name,输入点号(.)然后敲下 Ctrl+Space 来触发代码补全。但遗憾的是并没有起什么作用:
添加类型提示
让我们来修改上面例子的一行代码。
我们将把下面这段代码中的函数参数从:
first_name, last_name
改为
first_name: str, last_name: str
这些就是"类型提示":
def get_full_name(first_name: str, last_name: str):
full_name = first_name.title() + " " + last_name.title()
return full_name
print(get_full_name("john", "doe"))
这时候通过 Ctrl+Space 触发自动补全,你会发现:
在 Python 中,类型提示(Type Hints)是一种可选的语法,用于指定变量、函数参数和返回值的预期数据类型。它的主要作用是提高代码的可读性和可维护性,同时帮助 IDE 和静态类型检查工具(如 mypy)提前发现潜在的类型错误。
基本语法
类型提示的核心是通过 : 符号指定类型,函数返回值类型则通过 -> 声明。
1. 变量的类型提示
为变量赋值时,可以在变量名后添加 : 类型 来指定其类型:
name: str = "Alice" # 字符串类型
age: int = 30 # 整数类型
height: float = 1.75 # 浮点数类型
is_student: bool = True # 布尔类型
2. 函数的类型提示
函数的参数和返回值都可以添加类型提示:
def add(a: int, b: int) -> int:
return a + b
a: int和b: int表示参数a和b应为整数-> int表示函数返回值应为整数
复杂类型提示
对于列表、字典、元组等复合类型,需要从 typing 模块(Python 3.9+ 也可直接用内置泛型类型)导入相关工具:
1. 列表(List)
指定列表中元素的类型:
from typing import List
numbers: List[int] = [1, 2, 3] # 整数列表
names: List[str] = ["Alice", "Bob"] # 字符串列表
# Python 3.9+ 可直接用 list[int]
numbers: list[int] = [1, 2, 3]
2. 字典(Dict)
指定字典的键和值的类型:
from typing import Dict
person: Dict[str, int] = {"age": 30, "height": 175} # 键为字符串,值为整数
# Python 3.9+ 可直接用 dict[str, int]
person: dict[str, int] = {"age": 30, "height": 175}
3. 元组(Tuple)
元组的类型提示需要指定每个元素的类型(元组长度固定):
from typing import Tuple
point: Tuple[int, int] = (10, 20) # 两个整数组成的元组
user: Tuple[str, int, bool] = ("Alice", 30, True) # 字符串、整数、布尔值组成的元组
# Python 3.9+ 可直接用 tuple[int, int]
point: tuple[int, int] = (10, 20)
4. 可选类型(Optional)
表示变量或参数可以是指定类型或 None:
from typing import Optional
def get_name(id: int) -> Optional[str]:
if id == 1:
return "Alice"
return None # 允许返回 None
# Python 3.10+ 可简化为 str | None
def get_name(id: int) -> str | None:
...
5. 联合类型(Union)
表示变量或参数可以是多种类型中的一种:
from typing import Union
def print_value(value: Union[int, str]) -> None:
print(value) # 允许传入整数或字符串
# Python 3.10+ 可简化为 int | str
def print_value(value: int | str) -> None:
...
6. 任意类型(Any)
表示类型不确定(不推荐过度使用,会失去类型提示的意义):
from typing import Any
def process_data(data: Any) -> Any:
return data # 接受任意类型,返回任意类型
类作为类型
你也可以将类声明为变量的类型。
假设你有一个名为 Person 的类,拥有 name 属性:
class Person:
def __init__(self, name: str):
self.name = name
def get_person_name(one_person: Person):
return one_person.name
接下来,你可以将一个变量声明为 Person 类型:
class Person:
def __init__(self, name: str):
self.name = name
def get_person_name(one_person: Person):
return one_person.name
类型提示的特点
- 可选性:Python 解释器不会强制检查类型,即使类型不匹配也能运行(动态类型特性仍保留)。
- 工具支持:IDE(如 PyCharm、VS Code)会根据类型提示提供自动补全和错误提示;静态检查工具(如
mypy)可手动检查类型错误。 - 兼容性:从 Python 3.5 开始支持,后续版本不断扩展(如 3.9 的内置泛型、3.10 的联合类型简化语法)。
实际应用价值
- 提高可读性:代码使用者能快速了解函数参数和返回值的预期类型。
- 减少错误:通过工具提前发现类型不匹配的问题(如给需要整数的函数传入字符串)。
- 便于维护:重构代码时,类型提示能帮助确认修改是否影响其他部分。
例如,使用 mypy 检查以下代码:
def add(a: int, b: int) -> int:
return a + b
result = add("1", 2) # 错误:传入字符串而非整数
运行 mypy script.py 会提示类型错误,帮助提前定位问题。
总之,类型提示是 Python 提升代码健壮性的重要工具,尤其适合大型项目或团队协作。
更多推荐
所有评论(0)