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

Posted

技术标签:

【中文标题】将多个 isinstance 检查转换为结构模式匹配【英文标题】:Convert multiple isinstance checks to structural pattern matching 【发布时间】:2021-08-04 01:21:17 【问题描述】:

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

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) 等多种可能的类型进行测试?

【问题讨论】:

【参考方案1】:

转换为模式匹配的示例

这是使用 matchcase 的等效代码:

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

说明

PEP 634 指定使用class patterns 执行isinstance() 检查。要检查 str 的实例,请写 case str(): ...。请注意,括号是必不可少的。这就是语法如何确定这是一个类模式。

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

【讨论】:

以上是关于将多个 isinstance 检查转换为结构模式匹配的主要内容,如果未能解决你的问题,请参考以下文章

c# 中模拟一个模式匹配及匹配值抽取

isinstanceissubbclass

我必须将记录结构转换为类,并且不断收到多个错误[关闭]

Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)

将复杂字符串字段中的多个值转换为可数结构

将复合模式转换为具有附加行为的新模式