如何在 Python 中使用联合类型操作符

By iswbm / Published At 2024-06-01 / In categories Programming, Python

python

继续给大家介绍 Python 3.10 的新特性,今天要给大家介绍的是 联合类型操作符。

在以前,我们判断一个类型是否是某几个类型中的一个的时候,一般可以这么写的

def check_type_str_or_int(obj):
    if isinstance(obj, str):
        return True
    elif isinstance(obj, int):
        return True
    else:
        return False

或者可以更加简洁一点

def check_type_str_or_int(obj):
    t = type(obj)
    if t in [str, int]:
        return True
    else:
        return False

但在 3.10 以后,你再也不用写那么多代码了,使用 3.10 中新增的联合类型操作符 | 就可以轻松实现。

>>> isinstance(1024, int | str)
True

到这里,你会不会有这些疑问:难道联合类型操作符,就是为了方便 isinstance 函数的判断吗?

其实不是的,就算没有 联合类型操作符,isinstance 也可以用一行代码实现上述功能,只是没那么直观

>>> isinstance(1024, (int, str))
True
>>> isinstance("iswbm", (int, str))
True

尝试打印一下 int | str ,发现它其实是一个 types.UnionType 类型的对象

相信使用类型注解的朋友,对它应该不会陌生,比如下面这个例子,表明函数的接收的参数和返回的结果都是一个 str 或者 int 类型的对象

from typing import Union

def demo(obj: Union[str, int]) -> Union[str, int]:
    return obj*2

而之前这种 typing.Union 联合类型 只能用于类型注解。

随着 Python 3.10 的到来, typing.Union 联合类型也可以用来其他地方,比如 isinstance 或者 issubclass 函数中。

并且,为了降低编码的难度,Python 还专门提供了一种联合类型的操作符 | ,利用这个操作符可以直接构造联合类型对象。

image-20211010232017072

因此以后类型注解可以用更直观的写法了

但千万注意,在这个操作符的两边,可以是内置类型,也可以是自定义类型,但不能是对象。

iswbm

Author

iswbm

Cloud Computing & Container & Front-end & Back-end R&D Engineer. I like to explore new technologies, and in my spare time, I also play around with Logseq and other efficiency tools. You can follow me on GitHub to learn more, or add me on WeChat (stromwbm) to communicate with me.