示例 1:表示单个可选值
from typing import Optional
def get_name(user_id: int) -> Optional[str]:
# 定义一个函数 get_name,接收一个整数 user_id,返回值可以是字符串或 None
if user_id == 1:
return "Alice" # 如果 user_id 是 1,返回字符串 "Alice"
else:
return None # 否则返回 None,表示没有找到用户
# 测试
name = get_name(2) # 调用函数,传入 user_id 2
print(name) # 输出: None,表示没有找到对应用户
解析:
from typing import Optional
: 从typing
模块导入Optional
类型。def get_name(user_id: int) -> Optional[str]
: 定义函数get_name
,参数user_id
为整数,返回值可以是字符串或None
。if user_id == 1:
: 检查user_id
是否为 1。return "Alice"
: 如果条件成立,返回字符串 “Alice”。return None
: 如果条件不成立,返回None
。
示例 2:表示列表中的可选元素
from typing import List, Optional
def process_numbers(nums: List[Optional[int]]) -> List[int]:
# 定义一个函数 process_numbers,接收一个整数列表 nums,其中的元素可以是 int 或 None
return [num for num in nums if num is not None] # 过滤掉列表中的 None 值
# 测试
numbers = [1, None, 2, None, 3] # 创建一个包含 int 和 None 的列表
processed = process_numbers(numbers) # 调用函数,处理列表
print(processed) # 输出: [1, 2, 3],返回过滤掉 None 后的新列表
解析:
def process_numbers(nums: List[Optional[int]]) -> List[int]
: 定义函数process_numbers
,接受一个包含Optional[int]
的列表,返回一个只含有int
的列表。[num for num in nums if num is not None]
: 列表推导式,循环遍历nums
,并仅保留非None
的元素。
示例 3:字典中的可选值
from typing import Dict, Optional
def get_user_data() -> Dict[str, Optional[str]]:
# 定义一个函数 get_user_data,返回一个字典,字典的值可以是字符串或 None
return {
"name": "Bob", # 用户名
"email": None, # 邮箱缺失,值为 None
"phone": "123-456-7890" # 电话号码
}
# 测试
user_data = get_user_data() # 调用函数获取用户数据
print(user_data) # 输出: {'name': 'Bob', 'email': None, 'phone': '123-456-7890'}
解析:
def get_user_data() -> Dict[str, Optional[str]]
: 定义函数get_user_data
,返回一个字典,键是字符串,值是可选字符串(可以是字符串或None
)。- 返回的字典中,
"email"
的值为None
,表示该用户没有提供邮箱。
示例 4:嵌套的可选值
from typing import List, Optional
def find_item(items: List[Optional[str]], search: str) -> Optional[int]:
# 定义一个函数 find_item,接收一个可选字符串列表和待查找的字符串
for index, item in enumerate(items): # 遍历列表,获取元素的索引和内容
if item == search: # 如果当前元素与搜索项相同
return index # 返回该元素的索引
return None # 如果没有找到,返回 None
# 测试
items = ["apple", None, "banana"] # 包含字符串和 None 的列表
index = find_item(items, "banana") # 查找 "banana" 的索引
print(index) # 输出: 2,表示 "banana" 在列表中的索引是 2
index_not_found = find_item(items, "orange") # 查找 "orange" 的索引
print(index_not_found) # 输出: None,表示没有找到 "orange"
解析:
def find_item(items: List[Optional[str]], search: str) -> Optional[int]
: 定义函数find_item
,接受一个可选字符串列表和一个待查找的字符串,返回索引或None
。for index, item in enumerate(items)
: 使用enumerate
迭代列表,获得每个元素的索引和内容。if item == search
: 检查当前元素是否与要查找的字符串相同。return None
: 如果没有找到匹配项,返回None
。
总结
Optional[X]
: 表示可以是类型X
的值或者None
。- 结合其他类型使用:
Optional
常与List
,Dict
等集合类型结合,表示集合中的元素可以是None
。 - 应用场景:
- 函数返回值可以是某种类型或
None
,使得函数的返回值更灵活。 - 列表或字典中可以存在缺失的值,适合处理不完整的数据。
- 明确哪些值是可选的,提高代码的可读性和可维护性。
- 函数返回值可以是某种类型或