Установка псевдонимов и паттерн AS

Последнее обновление: 01.02.2022

Оператор as позволяет установить псевдоним для значения шаблона или для всего шаблона. Простейший пример:

def print_person(person):
    match person:
        case "Tom" | "Tomas" | "Tommy" as name:
            print(f"Name: {name}")
        case _:
            print("Undefined")


print_person("Tom")     # Name: Tom
print_person("Tomas")   # Name: Tomas
print_person("Bob")     # Undefined

Здесь первый шаблон соответствует трем строкам: "Tom" | "Tomas" | "Tommy". После набора значений идет оператор as, после которого указывается псевдоним. И вне зависимости от того, какая именно строка передана, она окажется в переменной name.

Псевдоним можно применять как для отдельного значения шаблона, так и для всего шаблона:

def print_person(person):
    match person:
        case ("Tom" | "Tomas" as name, 37 | 38 as age):   # псевдонимы для отдельных значений
            print(f"Tom| Name: {name}  Age: {age}")
        case ("Bob" | "Robert", 41 | 42) as bob:          # псевдоним для всего шаблона
            print(f"Bob| Name: {bob[0]}  Age: {bob[1]}")
        case _:
            print("Undefined")


print_person(("Tomas", 38))     # Tom| Name: Tomas  Age: 38
print_person(("Robert", 41))    # Bob| Name: Robert  Age: 41

Обычно псевдонимы более применимы в каких-то более сложных по структуре данных. Например:

class Person:
    __match_args__ = ("name", "age")
    def __init__(self, name, age):
        self.name = name
        self.age = age


def print_family(family):
    match family:
        case (Person() as husband, Person() as wife):
            print(f"Husband. Name: {husband.name}  Age: {husband.age}")
            print(f"Wife. Name: {wife.name}  Age: {wife.age}")
        case _:
            print("Undefined")


print_family((Person("Tom", 37), Person("Alice", 33)))
# Husband. Name: Tom  Age: 37
# Wife. Name: Alice  Age: 33

print_family((Person("Sam", 28), Person("Kate", 25)))
# Husband. Name: Sam  Age: 28
# Wife. Name: Kate  Age: 25

Здесь функция print_family принимает кортеж, который должен состоять из двух элементов Person. В первом шаблоне определяем для первого элемента псевдоним husband, а для второго - псевдоним wife. Затем, используя эти псевдонимы, мы можкем обращаться к их атрибутам.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850