插件窝 干货文章 Python UnionType类型提示中如何可靠地检查子成员类型?

Python UnionType类型提示中如何可靠地检查子成员类型?

Union 类型 type value 518    来源:    2025-03-15

在Python 3.10及以上版本中,UnionType 被引入作为 typing.Union 的类型提示的一部分。为了可靠地检查 UnionType 中的子成员类型,你可以使用 isinstance() 函数结合 typing 模块中的 get_args()get_origin() 函数。

以下是一个示例,展示如何检查 UnionType 中的子成员类型:

from typing import Union, get_args, get_origin

def check_union_member(value, union_type):
    # 获取 Union 类型的原始类型和参数
    origin = get_origin(union_type)
    args = get_args(union_type)

    # 检查是否是 Union 类型
    if origin is Union:
        # 遍历 Union 的所有子类型
        for arg in args:
            if isinstance(value, arg):
                return True
        return False
    else:
        # 如果不是 Union 类型,直接检查类型
        return isinstance(value, union_type)

# 示例使用
value = 42
union_type = Union[int, str]

if check_union_member(value, union_type):
    print(f"{value} 是 {union_type} 的一个子类型")
else:
    print(f"{value} 不是 {union_type} 的子类型")

解释:

  1. get_origin(union_type): 获取 union_type 的原始类型。对于 Union[int, str]get_origin 会返回 typing.Union
  2. get_args(union_type): 获取 union_type 的类型参数。对于 Union[int, str]get_args 会返回 (int, str)
  3. isinstance(value, arg): 检查 value 是否是 arg 类型的实例。

注意事项:

  • 如果你使用的是 Python 3.10 及以上版本,Union[int, str] 可以直接写成 int | str,但 get_originget_args 仍然适用。
  • 如果你需要处理更复杂的类型(如嵌套的 Union 或泛型类型),你可能需要递归地处理 get_args 的结果。

通过这种方式,你可以可靠地检查 UnionType 中的子成员类型。