Курс по усъвършенствано разработване с 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) в този формат, нивото ще бъде завършено.