Как выразить логику набора текста 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