Продвинутый курс разработки на Python
Глава
>
Уровень
Декораторы
Более сложные декораторы
Цель
Поместите пиццы в духовку при правильной температуре и приготовьте салаты с помощью декораторов с аргументами.
Теперь, когда пиццы уже подготовлены, настало время запечь их в духовках, а когда это будет сделано, следует приготовить салаты, которые будут подаваться с пиццами. Вы можете выполнить эти задачи, используя декораторы с аргументами; подобно пользовательским функциям, вы также можете передавать аргументы через декораторы.
Пиццы нужно поместить в духовку, но сначала вам необходимо собрать больше firewood в нижней левой части карты. После того как вы их соберете, заберите корзину на прилавке у левой духовки — эта корзина содержит pizza, предназначенную для запекания в духовках.
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).
Пока вы размещаете пиццы и дрова в духовках, остановитесь на золотой отметке X и повернитесь к шкафу, где можно собрать ингредиенты для приготовления салатов. На данный момент ингредиенты для салата хранятся во вложенном списке, представленном в редакторе кода, однако этот список неупорядочен, и вам будет полезнее сохранить элементы в корректном списке для дальнейшего использования в салатах.
cabinet = [["lettuce"], ["carrot" ,"tomato"] , ["oil" , "ranch", "cesar"] , ["cheese"]] ingredients = [item for sublist in cabinet for item in sublist]
Создайте список с именем ingredients и используйте генератор списка для «выпрямления» вложенного списка. Это процесс удаления вложенных списков, чтобы все элементы оказались в одном списке, а не распределены по нескольким маленьким спискам. После того как список будет выпрямлен, используйте функцию 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) в указанном формате, уровень будет пройден.