Menu
Coddy logo textTech

Łą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!

challenge icon

Wyzwanie

Średni

Napisz 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