typing.Union 标注一多种变量类型
 
typing.Union 是Python typing 模块中用于标注一个变量可以是多种类型之一的类型提示。在Python 3.10版本及以后,推荐使用 | 运算符代替 Union。不过,在详细介绍 Union 的用法前,值得注意的是在大多数情况下,如果一个变量可以是 None 或其他类型,你应该使用 Optional 类型,它是 Union 的一个特殊情况。
作为函数参数
当你有一个函数,其参数可以是多种类型中的一种时,你可以使用 Union 来标注这个参数。
from typing import Uniondef process_data(data: Union[str, bytes]) -> None:if isinstance(data, str):print("Data is a string:", data)else:print("Data is bytes:", data.decode('utf-8'))
在这个例子中,process_data 函数接受一个参数 data,它可以是 str 或 bytes 类型。函数内部使用 isinstance 函数来检查 data 的类型,并据此执行不同的操作。
作为返回值
Union 也可以用来标注一个函数的返回值可能是多种类型中的一种。
from typing import Uniondef get_data(flag: bool) -> Union[str, bytes]:if flag:return "Hello, world!"else:return b"Hello, world!"
在这个例子中,get_data 函数根据布尔参数 flag 返回一个 str 或 bytes 类型的值。
使用 | 运算符
从Python 3.10开始,你可以使用 | 运算符来代替 Union。
def process_data(data: str | bytes) -> None:if isinstance(data, str):print("Data is a string:", data)else:print("Data is bytes:", data.decode('utf-8'))def get_data(flag: bool) -> str | bytes:if flag:return "Hello, world!"else:return b"Hello, world!"
在这个例子中,process_data 和 get_data 函数的类型标注方式与之前使用 Union 的例子相同,但更为简洁。
注意事项
- 使用 Union或|运算符时,应确保你的代码能正确处理所有可能的类型。
- 对于可以是 None的类型,推荐使用Optional[Type],这等同于Union[Type, None]。
- 使用 Union时,避免将太多的类型组合在一起,这会使代码更难以阅读和维护。如果一个变量可以有许多不同的类型,考虑是否可以通过重构代码或使用类和继承来简化类型关系。
- 在使用 Union或|运算符时,确保你的代码在运行时也能正确处理所有声明的类型。这可能涉及到运行时类型检查和适当的错误处理。