Поглиблений курс розробки на Python
Розділ
>
Рівень
Декоратори
Більш складні декоратори
Мета
Помістіть піци в піч за правильною температурою та приготуйте салати, використовуючи декоратори з аргументами.
Тепер, коли піци вже підготовлені, настав час запікати їх у пічах. Після того, як це буде зроблено, нам потрібно підготувати салати, які подаватимуться разом з піцами після їхнього приготування. Ви можете виконати ці завдання, використовуючи декоратори з аргументами; подібно до користувацьких функцій, ви також можете передавати аргументи через ваші декоратори.
Піци потрібно розмістити в піч, але спочатку вам потрібно зібрати більше "firewood" у нижньому лівому куті карти. Після збору візьміть кошик на прилавку біля лівої печі, цей кошик містить "pizza", яку потрібно запікати в пічах.
Є функція та її декоратор, налаштовані в редакторі коду. Функція використовується для розміщення та запікання "pizza" у печі, а декоратор перевіряє, чи має піч правильну температуру, і якщо температура невірна, замість неї розміщується "firewood".
def place_oven(func):
def check(temp):
if temp < 450:
player.speak("Oven is not hot enough")
player.open()
player.place("firewood")
player.close()
return
return func(temp)
return check
@place_oven
def bake_pizza(temp):
player.open()
player.place("pizza")
player.close()
player.speak("I am baking Pizza at %d degrees" % (temp))
Перейдіть до позначок із легким X та використайте функцію read(), повернувшись до печі, щоб визначити її температуру. Потім напишіть декоровану функцію bake_pizza() і додайте зчитану температуру як аргумент, наприклад: bake_pizza(450).
Поки ви розміщуєте піци та "firewood" у пічах, зупиніться біля позначки із золотим X і зверніться до шафи, де ви можете зібрати інгредієнти для приготування салатів. Наразі інгредієнти для салатів зберігаються у вкладеному списку, який наведено в редакторі коду, проте цей список непорядний, і вам буде вигідніше зберегти елементи в окремому списку для подальшого використання у салатах.
cabinet = [["lettuce"], ["carrot" ,"tomato"] , ["oil" , "ranch", "cesar"] , ["cheese"]] ingredients = [item for sublist in cabinet for item in sublist]
Створіть список з ім’ям ingredients та використайте скорочення списку (List Comprehension) для “розгладження” вкладеного списку. Це процес видалення підсписків із вкладеного списку, щоб усі елементи опинилися в одному великому списку, а не в декількох менших. Після того, як список буде розгладжено, використайте функцію speak() з цим списком для перевірки інгредієнтів, які ви збираєтеся використовувати.
Після того, як всі необхідні предмети будуть розміщені в пічах, а список ingredients буде сформований, перейдіть до позначок із темним X для створення салатів. У редакторі налаштована функція та декоратор, які цього разу не зв’язані і повинні бути оголошені вручну, наприклад: salad = add_toppings(toss_salad("ranch","carrot")). Цей набір функцій приймає два (2) аргументи: dressing та vegetable.
def add_toppings(func):
def add(dressing, vegetable):
player.place(dressing)
player.place(vegetable)
func(dressing, vegetable)
return add
@add_toppings
def toss_salad(dressing, vegetable):
player.combine("lettuce", dressing, vegetable)
player.speak("I am preparing salad with %s dressing and %s"
% (dressing, vegetable))
Кожна позначка із темним X розташована на кольоровому килимі, і на кожному з них потрібно створити інший салат, використовуючи інгредієнти, зібрані зі шафи. На жовтому килимі створіть салат із використанням: "cesar" та "cheese"; на зеленому килимі створіть салат із використанням: "oil" та "tomato"; на синьому килимі створіть салат із використанням: "ranch" та "carrot".
Як тільки всі три (3) салати будуть зібрані за допомогою декорованої функції toss_salad(dressing, vegetable) у зазначеному форматі, рівень буде завершено.