现代 Python (Python 3.5+) 引入了类型提示(Type Hinting),这极大地增强了代码的可读性和健壮性。理解如何正确地为函数参数和返回值添加类型提示,以及如何区分类型与默认值,是编写专业 Python 代码的基础。
1. 类型提示 (Type Hinting) 的基本语法
类型提示通过在变量名后添加冒号 : 来声明其期望的类型,通过 -> 来声明函数的返回值类型。
# text 参数期望是 str 类型
# -> str 表示函数期望返回一个 str 类型
def greet(text: str) -> str:
return "Hello, " + text
核心作用:
- 可读性: 任何人读到这个函数签名,都能立刻明白它需要什么类型的输入,并会返回什么类型的输出。
- 静态分析: PyCharm、VS Code 等 IDE 和 MyPy 等工具可以利用这些提示来提前发现潜在的类型错误,避免运行时 Bug。
- 它只是"提示": 类型提示在默认情况下不强制执行。您仍然可以传递一个非字符串给 greet 函数,但您的代码检查工具会发出警告。
2. 定义可选类型:str | None
在函数参数中,我们经常需要允许传入某个特定类型,或者 None。
- param: str | None (Python 3.10+): 这是最新、最推荐的写法,使用管道符 | 表示"或"。它清晰地表明 param 的类型可以是一个字符串,也可以是 None。
- param: Optional[str] (Python 3.9 及更早): 这是经典写法,需要从 typing 模块导入 Optional。它与 str | None 的含义完全相同。
关键点: 在 param: str | None 中,None 是类型定义的一部分,表示 NoneType。它不是一个默认值。
3. 定义可选参数:使用默认值 =
要让一个参数成为可选参数(调用时可以不传递),我们必须使用 = 为它提供一个默认值。
# 这是一个可选参数,如果不提供,默认为 "World"
def greet_default(name: str = "World"):
print(f"Hello, {name}")
greet_default("Alice") # 输出: Hello, Alice
greet_default() # 正确!输出: Hello, World
4. 黄金组合:类型提示 + 默认值
在实践中,我们最常将可选类型和默认值结合起来,创建一个真正意义上的、健壮的可选参数。
# name 参数的类型可以是 str 或 None,并且它默认为 None
def create_user(name: str | None = None):
if name:
print(f"正在创建用户: {name}")
else:
print("正在创建匿名用户")
create_user("Bob") # 输出: 正在创建用户: Bob
create_user() # 正确!输出: 正在创建匿名用户
总结对比:
语法 | 含义 | 参数是否必需? |
---|---|---|
param: str | 参数必须是字符串。 | ✅ 必需 |
param: str | None | 参数必须是字符串或 None。 | ✅ 必需 |
param: str = "default" | 参数是字符串,默认为 "default"。 | ❌ 可选 |
param: str | None = None | 参数是字符串或 None,默认为 None。 | ❌ 可选 |