Curso Avançado de Desenvolvimento Python
Capítulo
>
Nível
Decoradores
Encadeamento de Decoradores
Objetivo
Decore o telhado com bandeiras coloridas encadeando decoradores.
O telhado recebeu um pouco de ar fresco após ficar confinado dentro daquela cozinha por tanto tempo, e algumas das linhas não possuem bandeiras. Seria uma boa ideia colocá-las enquanto você está aqui, porém pode ser complicado, pois são necessárias várias bandeiras para configurar uma linha. Você pode conseguir isso encadeando os decoradores.
Decoradores são encadeados duplicando os sinais @, ou seja, aplicando múltiplos decoradores em uma única função. Por exemplo, isso permite que você insira uma função entre duas funções decoradoras:
# List to add flags to a line
line = []
# Decorator adding a red flag
def red_flag(func):
def add_flag():
line.append("red")
player.speak("Two red flags added to the line")
func()
line.append("red")
return add_flag
# Decorator adding a blue flag
def blue_flag(func):
def add_flag():
line.append("blue")
player.speak("Two blue flags added to the line")
func()
line.append("blue")
return add_flag
# Decorated Function adding line and middle flag
@blue_flag
@red_flag
def middle_green():
line.append("green")
player.speak("A green flag has been added to the line")
O código acima ilustra uma função com decoradores encadeados, que são incorporados à função de forma que, nas extremidades da linha, bandeiras azuis são colocadas, na camada interna, bandeiras vermelhas, e, por fim, no meio, uma bandeira verde é colocada. Todas elas são adicionadas a uma lista chamada line; este é o método que será usado para configurar as bandeiras nas linhas.
Comece caminhando até a marca dourada em forma de X e use a função read() para verificar as instruções listadas no sinal. Lá, ele informará quais bandeiras colocar em cada posição, havendo três (3) tipos diferentes de bandeiras coloridas: "red", "green" e "blue". Cada linha terá todas as três bandeiras, uma (1) no meio da linha, duas (2) na linha interna e duas (2) na linha externa, totalizando cinco (5) bandeiras por linha, assim como a linha pré-fabricada no canto inferior esquerdo do mapa.
Caminhe até a marca X clara e use a função collect() para recolher as "flags" na caixa. Em seguida, caminhe até as marcas X escuras e, da esquerda para a direita, comece a colocar as bandeiras na ordem descrita nas instruções que você leu anteriormente. Use as funções do meio para conseguir isso, por exemplo: middle_green() cria uma linha de bandeiras assim: ["blue", "red", "green" ,"red","blue" ]. Depois, use a função place() para posicionar a linha utilizando a lista line, assim: place(line).
Entre cada marca X, limpe a lista line usando a função clear(), assim: line.clear(), o que permite reutilizar a lista sem precisar criar uma nova para cada linha. A última marca X, à direita, requer uma função personalizada:
@
@
def middle_custom():
line.append( Insert append )
player.speak("%s flag has been added to the line"
% ( insert flag ))
Utilize os dois símbolos @ para adicionar decoradores à função, depois preencha o append da linha e a cor da bandeira na string. Faça isso de acordo com as instruções no sinal para completar o nível.