我有通过查找属性来检查命名元组和数据类的代码:_fields
if hasattr(candidate, '_fields'):
do_action()
如何使用 Python 3.10 的匹配/大小写结构模式匹配来表达这一点?
用于结构模式匹配的PEP 634将此功能记录为类模式:
cls()
会做一个isinstance()测试。cls(attr=variable)
测试属性的存在并将值绑定到变量。_fields
必须存在的属性。_
您的具体示例if hasattr(candidate, '_fields'): do_action()
,转换为:
match candidate:
case object(_fields=_):
do_action()
这显示了所有部分如何组合在一起:
from typing import NamedTuple
from dataclasses import dataclass
class Whale(NamedTuple):
name: str
num_fins: int
@dataclass
class Vehicle:
name: str
num_wheels: int
subject = Vehicle('bicycle', 2)
match subject:
case object(num_fins=n):
print(f'Found {n} fins')
case object(num_wheels=_):
print(f'Found wheeled object')
case _:
print('Unknown')
该脚本输出:
Found wheeled object