Łączenie dekoratorów
Lekcja 7 z 12 w kursie Dekoratory w Pythonie w Coddy.
Możliwe jest łączenie wielu dekoratorów, aby zmodyfikować zachowanie funkcji. Aby łączyć dekoratory, wystarczy zastosować je jeden po drugim, przy czym dekorator najbardziej wewnętrzny znajduje się najbliżej dekorowanej funkcji.
Oto przykład:
def make_bold(func):
def wrapper():
return "<b>" + func() + "</b>"
return wrapper
def make_italic(func):
def wrapper():
return "<i>" + func() + "</i>"
return wrapper
@make_bold
@make_italic
def hello():
return "Hello, world!"
print(hello())Końcowy wynik to:
<b><i>Hello, world!</i></b>Zauważ, że w powyższym przykładzie dekorator zwraca wartość z funkcji. Do tej pory widzieliśmy tylko dekoratory, które wykonują funkcję, nie zwracając jej wyniku!
Wyzwanie
ŚredniNapisz funkcję o nazwie my_decorator, która przyjmuje argument całkowity n i zwraca funkcję dekorującą, która opakowuje daną funkcję func w n warstw znaczników HTML. Najbardziej zewnętrznym znacznikiem powinien być <div>, kolejną warstwą powinien być <p> i tak dalej, przy czym każda kolejna warstwa powinna naprzemiennie używać znaczników <div> i <p>. Najbardziej wewnętrzna warstwa powinna opakowywać wynik funkcji w znaczniki <b>.
Otrzymujesz kod, który zostanie wykonany z użyciem my_decorator — nie zmieniaj go!
Przykład:
@my_decorator(3)
def my_function(s):
return s.upper()
result = my_function("hello world")
print(result)Wynik:
<div>
<p>
<div>
<b>
HELLO WORLD
</b>
</div>
</p>
</div>Użyj znaków nowej linii (
\n), aby poprawnie sformatować wynik!
Spróbuj swoich sił
# Napisz tutaj kod
# Nie zmieniaj niczego poniżej tej linii
n = int(input())
@my_decorator(n)
def my_function(s):
return s.upper()
result = my_function(input())
print(result)Wszystkie lekcje w sekcji Dekoratory w Pythonie
Poćwicz samodzielnie: Kompilator Python online