返回博客列表

现代Python函数定义:类型提示与可选参数

深入探讨Python函数定义的现代特性,包括类型提示、可选参数、默认值等高级用法。

2024-01-174 分钟阅读Yaron
#Python#类型系统#函数式编程#Python3.10+

现代 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。可选