如何用结构模式匹配来表达 hasattr() 鸭子类型逻辑?
How to express hasattr() duck typing logic with structural pattern matching?
我有代码通过查找 _fields
属性来检查 named tuples and dataclasses:
if hasattr(candidate, '_fields'):
do_action()
如何用 Python 3.10 的 match/case 结构模式匹配来表达这个?
了解文档
PEP 634 for structural pattern matching documents this capability as a class pattern:
- 写入
cls()
将进行 isinstance() 测试。
- 添加关键字模式
cls(attr=variable)
测试是否存在属性并将值绑定到变量。
模拟 hasattr() for duck typing:
- 将 cls 设置为 object 以便任何 class 都可以匹配。
- 将 attr 设置为
_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
我有代码通过查找 _fields
属性来检查 named tuples and dataclasses:
if hasattr(candidate, '_fields'):
do_action()
如何用 Python 3.10 的 match/case 结构模式匹配来表达这个?
了解文档
PEP 634 for structural pattern matching documents this capability as a class pattern:
- 写入
cls()
将进行 isinstance() 测试。 - 添加关键字模式
cls(attr=variable)
测试是否存在属性并将值绑定到变量。
模拟 hasattr() for duck typing:
- 将 cls 设置为 object 以便任何 class 都可以匹配。
- 将 attr 设置为
_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