Avancerad Pythonutvecklingskurs
Kapitel
>
Nivå
Dekoratorer
Mer komplexa dekoratorer
Mål
Placera pizzorna i ugnen vid rätt temperaturer och förbered sallader genom att använda dekoratorer med argument.
Nu när pizzorna redan är förberedda är det dags att laga dem i ugnarna. När det är ordnat bör vi förbereda sallader som ska serveras med pizzorna efter att de är klara. Du kan utföra dessa uppgifter genom att använda dekoratorer med argument; likt anpassade funktioner kan du även skicka argument genom dina dekoratorer.
Pizzorna måste placeras i ugnen men först måste du samla in mer "firewood" längst ner till vänster på kartan. När de är insamlade, plocka korgen vid disken vid den vänstra ugnen; denna korg innehåller "pizza" som ska bakas i ugnarna.
Det finns en funktion och dess dekorator är inställda i kodredigeraren. Funktionen används för att placera och baka "pizza" i ugnen, medan dekoratorn kontrollerar om ugnen har rätt temperatur, och om den inte har det placeras istället "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))
Gå till de ljusa X-märkena och använd funktionen read() medan du vänder dig mot ugnen, för att fastställa ugnens temperatur. Fortsätt därefter med att skriva den dekorerade funktionen bake_pizza() och lägg till den temperatur du läste som argument, till exempel: bake_pizza(450).
När du placerar pizzor och vedträ i ugnarna, stanna vid det gyllene X-märket och rikta blicken mot skåpet. Här kan du hämta ingredienserna för att sätta ihop sallader. För närvarande är salladsingredienserna lagrade i en nästlad lista, som visas i kodredigeraren, men listan är rörig och det vore bäst att ha objekten lagrade i en ordentlig lista för att kunna använda dem i dina sallader.
cabinet = [["lettuce"], ["carrot" ,"tomato"] , ["oil" , "ranch", "cesar"] , ["cheese"]] ingredients = [item for sublist in cabinet for item in sublist]
Skapa en lista med namnet ingredients och använd listkomprehension för att "platta till" den nästlade listan. Detta är processen att ta bort underslistorna ur den nästlade listan så att alla objekt nu finns tillsammans i en enda lista istället för i flera mindre listor. Efter att listan har plattats till, använd funktionen speak() med listan för att verifiera vilka ingredienser du tänker använda.
När alla nödvändiga föremål har placerats i ugnarna och ingredients-listan har hanterats, gå till de mörka X-märkena för att skapa salladerna. I redigeraren är en funktion och en dekorator inställda; den här gången är de inte kopplade och måste deklareras manuellt, till exempel: salad = add_toppings(toss_salad("ranch","carrot")). Denna uppsättning funktioner tar två (2) argument: dressing och 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))
Varje mörkt X-märke är placerat på en färgad matta, och varje har en egen sallad som behöver skapas med hjälp av de ingredienser du hämtade från skåpet. På den gula mattan, skapa en sallad med: "cesar" och "cheese"; på den gröna mattan, skapa en sallad med: "oil" och "tomato"; på den blå mattan, skapa en sallad med: "ranch" och "carrot".
När alla tre (3) sallader har satts ihop med hjälp av den dekorerade funktionen toss_salad(dressing, vegetable) i detta format, kommer nivån att vara klar.