Как выразить логику набора текста hasattr() со структурным сопоставлением шаблонов?

У меня есть код, который проверяет именованные кортежи и классы данных , ища _fields атрибут:

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

Как я могу выразить это с помощью сопоставления структурных шаблонов совпадений / регистра в Python 3.10?

1 ответ

Понимание документации

PEP 634 для структурного сопоставления с образцом документирует эту возможность как образец класса :

  • Письмо cls()выполнит тест isinstance () .
  • Добавление шаблона ключевого слова cls(attr=variable) проверяет наличие атрибута и связывает значение с переменной.

Чтобы подражать hasattr () для утиного ввода :

  • Задайте cls как object, чтобы сопоставить любой класс.
  • Установите 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
Другие вопросы по тегам