高级 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)。
当你把比萨和火柴放入烤箱时,请停在带有金色 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"))。这组函数接收两个参数: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" 制作沙拉。
当所有三款沙拉都按照上述格式,使用装饰函数 toss_salad(dressing, vegetable) 制作完成后,关卡将顺利通关。