将多个 isinstance 检查转换为结构模式匹配

Convert multiple isinstance checks to structural pattern matching

我想将此现有代码转换为使用模式匹配:

if isinstance(x, int):
    pass
elif isinstance(x, str):
    x = int(x)
elif isinstance(x, (float, Decimal)):
    x = round(x)
else:
    raise TypeError('Unsupported type')

如何使用模式匹配编写 isinstance 检查,以及如何同时针对 (float, Decimal) 等多种可能的类型进行测试?

转换为模式匹配的示例

这是使用 matchcase 的等效代码:

match x:
    case int():
        pass
    case str():
        x = int(x)
    case float() | Decimal():
        x = round(x)
    case _:
        raise TypeError('Unsupported type')

说明

PEP 634 specifies that isinstance() checks are performed with class patterns。要检查 str 的实例,请写入 case str(): ...。请注意,括号是必不可少的。这就是语法如何确定这是一个 class 模式。

为了一次检查多个 classes,PEP 634 使用 | 运算符提供了 or-pattern。例如,要检查一个对象是否是 floatDecimal 的实例,请写 case float() | Decimal(): ...。和以前一样,括号是必不可少的。