我想转换此现有代码以使用模式匹配:
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)
)?
这是使用 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 指定使用 类模式 执行 isinstance() 检查。 要检查 str 的实例,请写入
case str(): ...
。 请注意,括号是必不可少的。 这就是语法如何确定这是一个类模式。
为了一次检查多个类,PEP 634 使用 |
运算符提供了
or-pattern。 例如,要检查一个对象是否是 float 或 Decimal 的实例,请编写
case float() | Decimal(): ...
。 和以前一样,括号是必不可少的。
使用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