Поглиблений курс розробки на 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 ))
Використайте два символи @ для додавання декораторів до функції, далі заповніть значення, що додається до списку (line append) та колір прапора у рядку. Зробіть це відповідно до інструкцій на вивісці, щоб завершити рівень.