将多个 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】:转换为模式匹配的示例
这是使用 match 和 case 的等效代码:
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 检查转换为结构模式匹配的主要内容,如果未能解决你的问题,请参考以下文章