在 Python 中,类型注释(Type Annotations)允许你为变量、函数参数和返回值指定类型信息。预定义变量选项通常指的是在代码中预先定义一些可能的变量值,并在类型注释中使用这些预定义的值。
1. 使用 Literal
类型
Literal
类型允许你指定一个变量只能是某些特定的字面量值。这在处理枚举值或预定义选项时非常有用。
from typing import Literal
# 预定义的选项
Option = Literal["option1", "option2", "option3"]
def process_option(option: Option) -> None:
if option == "option1":
print("Processing option 1")
elif option == "option2":
print("Processing option 2")
elif option == "option3":
print("Processing option 3")
else:
raise ValueError("Invalid option")
process_option("option1") # 正常调用
process_option("option4") # 类型检查会报错
2. 使用 Enum
类型
Enum
类型是另一种常见的预定义变量选项的方式。它允许你定义一组命名的常量。
from enum import Enum
class Options(Enum):
OPTION1 = "option1"
OPTION2 = "option2"
OPTION3 = "option3"
def process_option(option: Options) -> None:
if option == Options.OPTION1:
print("Processing option 1")
elif option == Options.OPTION2:
print("Processing option 2")
elif option == Options.OPTION3:
print("Processing option 3")
else:
raise ValueError("Invalid option")
process_option(Options.OPTION1) # 正常调用
process_option("option1") # 类型检查会报错
3. 使用 Union
类型
如果你有多个可能的类型,可以使用 Union
类型来指定变量可以是这些类型中的任何一个。
from typing import Union
# 预定义的选项
Option = Union[int, str]
def process_option(option: Option) -> None:
if isinstance(option, int):
print(f"Processing integer option: {option}")
elif isinstance(option, str):
print(f"Processing string option: {option}")
else:
raise ValueError("Invalid option")
process_option(123) # 正常调用
process_option("option1") # 正常调用
process_option(123.45) # 类型检查会报错
4. 使用 TypedDict
类型
如果你需要处理预定义的字典结构,可以使用 TypedDict
类型。
from typing import TypedDict
class User(TypedDict):
name: str
age: int
role: Literal["admin", "user", "guest"]
def process_user(user: User) -> None:
print(f"Name: {user['name']}")
print(f"Age: {user['age']}")
print(f"Role: {user['role']}")
user1: User = {"name": "Alice", "age": 30, "role": "admin"}
process_user(user1)
user2: User = {"name": "Bob", "age": 25, "role": "user"}
process_user(user2)
user3: User = {"name": "Charlie", "age": 20, "role": "guest"}
process_user(user3)
总结
-
Literal
: 用于指定变量只能是某些特定的字面量值。 -
Enum
: 用于定义一组命名的常量。 -
Union
: 用于指定变量可以是多个类型中的任何一个。 -
TypedDict
: 用于定义预定义的字典结构。
这些类型注释工具可以帮助你在代码中更清晰地表达变量的预期值,并提高代码的可读性和可维护性。