Можете ли вы сопоставить шаблоны аннотаций типов Python?

Можете ли вы сопоставить шаблоны с типами Python?

Я видел простые примеры:

import builtins

match x:
    case builtins.str:
        print("matched str")
    case buildins.int:
        print("matched int")

Но мне бы хотелось сопоставить шаблон для вложенного типа, что-то вроде Annotated[Optional[Literal["a", "b", "c"]], "something here"] - возможно ли это?

Вы хотите сопоставить, был ли x аннотирован этой аннотацией, или вы хотите сопоставить, является ли x буквально объектом аннотации с этой структурой?

user2357112 24.07.2024 05:59

Другими словами, если бы вы использовали if вместо match, вы бы написали if x == Annotated[Optional[Literal["a", "b", "c"]], "something here"] или что-то другое?

user2357112 24.07.2024 06:04

Я хочу сопоставить, является ли x буквально объектом аннотации с этой структурой, и в идеале разрушить его.

Torkoal 24.07.2024 06:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сопоставление с образцом, по сути, сводится к цепочке вызовов isinstance и ==, среди прочего. Это означает, что если вы можете выразить Annotated[Optional[Literal["a", "b", "c"]], "something here"] как серию вызовов isinstance, == и т. д., вы можете выполнить сопоставление с образцом.

Проблема с попыткой сопоставления шаблонов элементов из typing заключается в том, что типы объектов typing.Annotated[...], typing.Optional[...] и т. д. являются деталями реализации (они являются подклассами typing._GenericAlias, а их переменные экземпляра и свойства не являются общедоступными), тогда как сопоставление с образцом (в частности, шаблоны классов) — это стиль, который идеально работает при программировании с использованием общедоступного API. Если вас не волнует доступ к деталям реализации, это может сработать:

import types
from typing import *

x = Annotated[Optional[Literal["a", "b", "c"]], "something here"]

AnnotatedAlias = type(Annotated[Any, Any])
UnionAlias = type(Union[Any, None])
LiteralAlias = type(Literal[None])

match x:
    case AnnotatedAlias(
        __args__=(
            UnionAlias(__args__=(LiteralAlias(__args__=("a", "b", "c")), types.NoneType)),
        )
    ):
        print("x matched")

Я думаю, что NoneType будет рассматриваться как шаблон захвата, а не шаблон значения - он будет соответствовать чему угодно и назначать это NoneType.

user2357112 24.07.2024 06:25

@user2357112 user2357112 хороший улов, спасибо!

dROOOze 24.07.2024 06:29

Другие вопросы по теме