Curso Avançado de Desenvolvimento Python
Capítulo
>
Nível
Decoradores
Otimizando Decoradores
Objetivo
Coletar ingredientes e preparar diferentes tipos de pizza usando decorators.
Agora que os fornos foram configurados, é hora de preparar algumas pizzas para que possamos cozinhá-las depois. Agora que sabemos como usar decorators, podemos trabalhar para otimizá-los um pouco. Usando o símbolo @ no código seguido pelo nome do decorator e colocando esse código acima da função decorada, podemos automaticamente anexar um decorator sem usar uma variável. Por exemplo:
# Decorator
def create_pizza(func):
def set():
pizza = ["dough","red sauce","cheese"]
player.combine(pizza)
func()
return set
# Function being decorated with @
@create_pizza
def peperoni_pizza():
player.place("Peperoni")
player.speak("Peperoni Pizza has been prepped")
# Using pre-decorated function
peperoni_pizza()
Vale ressaltar que essa técnica simplifica o processo ao ter uma função pré-decorada antes do uso, entretanto às vezes você pode ainda desejar atribuir um decorator a uma variável para maior flexibilidade.
Para começar, caminhe até a marca de X dourada e pegue os ingredientes para fazer a pizza. Os ingredientes para fazer a pizza são: "cheese", "dough", "red sauce", "peperoni", "ham", "olive", "pepper", "onion" e "pineapple". A maioria desses ingredientes está dentro de uma Matriz representando as prateleiras da despensa, use List Comprehensions para armazenar todos os itens que você deseja pegar em uma lista.
shelves = [ ["cheese", "dough", "jar"], ["jar", "red sauce", "jar"], ["peperoni", "jar" , "ham"], ["olive", "pepper", "onions"] ] ingredients = [ item for row in shelves for item in row if not "jar" in item]
No código acima a lista ingredients percorre as linhas da Matriz chamada shelves e remove todos os itens correspondentes a "jar". Essa List Comprehension nos economiza tempo de ter que adicionar tudo manualmente. Use a função speak() com a lista de ingredientes para verificar os itens que você vai usar.
Uma vez que todos os ingredientes foram coletados, exceto o "pineapple", as funções para fazer as pizzas precisam de funções place() adicionadas para completar sua utilidade. Essas funções estão configuradas no editor de código e são nomeadas: peperoni_pizza() que requer: "peperoni", vegetable_pizza() que requer: "olive", "pepper", "onion", e pineapple_pizza() que requer: "ham" e "pineapple".
Caminhe até as marcas de X escuras e use as funções decoradas para preparar as pizzas. Nas marcas de X com carpetes vermelhos crie peperoni_pizza(), nos carpetes verdes crie vegetable_pizza() e nos carpetes amarelos crie pineapple_pizza(). No seu caminho até o carpete amarelo, pare na marca de X clara, vire-se para o armário e use a função collect() para pegar o "pineapple". Prepare todas as pizzas para completar com sucesso o nível.