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

问题描述 投票:0回答:2

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

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)
)?

python switch-statement python-3.10 isinstance structural-pattern-matching
2个回答
60
投票

转换为模式匹配的示例

这是使用 matchcase 的等效代码:

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

说明

PEP 634 指定使用 类模式 执行 isinstance() 检查。 要检查 str 的实例,请写入

case str(): ...
。 请注意,括号是必不可少的。 这就是语法如何确定这是一个类模式。

为了一次检查多个类,PEP 634 使用 | 运算符提供了

or-pattern
。 例如,要检查一个对象是否是 floatDecimal 的实例,请编写
case float() | Decimal(): ...
。 和以前一样,括号是必不可少的。


3
投票

使用Python

match
case

没有异常处理

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

一些额外内容

这段代码中还有一些流程。

有异常处理

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

作为函数

def func(x):
    match x:
        case int():
            pass
        case str():
            try:
                x = int(x)
            except ValueError:
                raise TypeError('Unsupported type')
        case float() | Decimal():
            x = round(x)
        case _:
            raise TypeError('Unsupported type')
    return x
© www.soinside.com 2019 - 2024. All rights reserved.