Продвинутый курс разработки на Python
Глава
>
Уровень
Декораторы
Цепочка декораторов
Цель
Украсьте крышу цветными флагами, используя цепочку декораторов.
Крыша наконец-то наслаждается свежим воздухом после столь долгого пребывания в закрытой кухне, но некоторые линии лишены флагов. Было бы неплохо установить их, пока вы здесь, однако это может быть непросто, поскольку для формирования линии требуются различные флаги. Вы можете сделать это, используя цепочку декораторов.
Декораторы объединяются путем удвоения символов @, то есть посредством присоединения нескольких декораторов к одной функции. Например, это позволяет обернуть функцию между двумя функциями-декораторами:
# List to add flags to a line
line = []
# Decorator adding a red flag
def red_flag(func):
def add_flag():
line.append("red")
player.speak("Two red flags added to the line")
func()
line.append("red")
return add_flag
# Decorator adding a blue flag
def blue_flag(func):
def add_flag():
line.append("blue")
player.speak("Two blue flags added to the line")
func()
line.append("blue")
return add_flag
# Decorated Function adding line and middle flag
@blue_flag
@red_flag
def middle_green():
line.append("green")
player.speak("A green flag has been added to the line")
Приведенный выше код демонстрирует функцию с цепочкой декораторов, которые встроены в функцию таким образом, что на краях линии устанавливаются синие флаги, во внутреннем слое — красные, а в самом центре — зеленый флаг. Все они добавляются в список с именем line. Этот метод будет использоваться для расстановки флагов на линиях.
Начните с того, что подойдите к золотой метке X и используйте функцию read(), чтобы ознакомиться с инструкциями, указанными на указателе. Там будет пояснено, какие флаги куда ставить, причем существует три (3) различных типа цветных флагов: "red", "green" и "blue". Каждая линия будет содержать все три флага: один (1) в середине, два (2) во внутренней части и два (2) на внешней стороне, что в сумме дает пять (5) флагов на линию, как и в заранее подготовленной линии в нижнем левом углу карты.
Подойдите к светлой метке X и используйте функцию collect(), чтобы забрать "flags" из ящика. Затем пройдите к темным меткам X и, двигаясь слева направо, начните расставлять флаги в том порядке, который был описан в инструкциях, прочитанных ранее. Для этого используйте функции для центральной части. Например, функция middle_green() создает линию флагов следующим образом: ["blue", "red", "green" ,"red","blue" ]. Затем используйте функцию place() для установки линии с использованием списка line, вот так: place(line).
Между каждой меткой X очищайте список line с помощью функции clear(), вот так: line.clear(). Это позволяет использовать один и тот же список без необходимости создавать новый для каждой линии. Последняя метка X справа требует создания собственной функции:
@
@
def middle_custom():
line.append( Insert append )
player.speak("%s flag has been added to the line"
% ( insert flag ))
Используйте два символа @ для добавления декораторов к функции, затем заполните аргументы в строке добавления элемента списка, указав цвет флага. Сделайте это в соответствии с инструкциями на знаке, чтобы завершить уровень.