当前位置: 首页 > 知识库问答 >
问题:

如何用结构模式匹配来表达hasattr()duck类型逻辑?

明宜年
2023-03-14

我有通过查找_fields属性来检查命名元组和数据类的代码:

if hasattr(candidate, '_fields'):
    do_action()

如何使用Python 3.10的匹配/大小写结构模式匹配来表达这一点?

共有1个答案

姜建德
2023-03-14

用于结构模式匹配的PEP 634将此功能记录为类模式:

  • 写入cls()将执行isinstance()测试

要模拟用于duck类型的hasattr():

  • 将cls设置为object,以便任何类都可以匹配
  • 将attr设置为字段,该属性必须存在
  • 如果不需要捕获值,请将变量设置为,如果确实要捕获值,请将变量设置为其他变量名称

您的具体示例“if hasattr(候选者,“\u字段”):do\u 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
 类似资料:
  • 字面量 变量 占位符

  • 使用结构模式匹配,如何编写匹配哈希类型实例的案例? 我尝试过: 但是,这得到了错误的答案,因为每个类型都定义了它是否可哈希:

  • 模式有两种形式:refutable(可反驳的)和 irrefutable(不可反驳的)。能匹配任何传递的可能值的模式被称为是 不可反驳的(irrefutable)。一个例子就是 语句中的 x,因为 x 可以匹配任何值所以不可能会失败。对某些可能的值进行匹配会失败的模式被称为是 可反驳的(refutable)。一个这样的例子便是 if let Some(x) = a_value 表达式中的 Some

  • 我无法运行此代码: 我在Python中找不到匹配关键字。 我在这里找到的:https://www.python.org/dev/peps/pep-0622/#the-match语句 有什么想法吗?

  • 通过本书我们已领略过许多不同类型模式的例子. 本节会统一列出所有在模式中有效的语法并且会阐述你为什么可能会希望使用其中的每一个。 如第六章所示,可以直接匹配字面值模式。如下代码给出了一些例子: 这段代码会打印 one 因为 x 的值是 1。 匹配命名变量 命名变量是匹配任何值的不可反驳模式,这在之前已经使用过数次。然而当其用于 match 表达式时情况会有些复杂。因为 match 会开始一个新作用

  • 问题内容: 该字符串可以类似于以下之一: 我想匹配不限数量的“ a(x,y)”。如何使用Regex做到这一点?这是我所拥有的: 它仅匹配“ a(x,y)”的两个递归。 问题答案: Java的标准正则表达式库不支持递归,因此您无法将此类通用嵌套结构与之匹配。 但是在确实支持递归的版本(Perl,PCRE,.NET等)中,您可以使用以下表达式: