Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # %%
- def deco_outer(how_many_times):
- """
- Dekorátor (vnější s parametrem), který zavolá dekorovanou funkci tolikrát, kolikrát mu to zadám.
- """
- def deco_inner(func):
- """
- Dekorátor (vnitřní s volanou funkcí), vrací zřejmě tu pozměněnou původní funkci
- """
- def wrapper(*args, **kwargs):
- """
- Wrapper, který vypíše před a za spuštěnou dekorovanou funkcí nějaké průvodní texty (ale může udělat prakticky cokoli). Předají se do něj kompletně všechny argumenty dekorované funkce a on je potom předá dál.
- """
- for i in range(how_many_times):
- print("Spouštím odpočítávání číslo: " + str(i + 1))
- return_values = func(*args, **kwargs)
- print("Získané pojmenované argumenty: ", kwargs) # dostávám prázdný slovník, jak se dostanu k separátoru původní funkce?
- end_message = "Skončilo odpočítávání číslo: " + str(i + 1)
- print(end_message)
- print(return_values[-1]*len(end_message))
- return return_values
- return wrapper
- return deco_inner
- # %%
- how_many_times_outer = 2
- @deco_outer(how_many_times_outer)
- def countdown(from_num, separator="-"):
- returned_string = ""
- for i in range(from_num, -1, -1):
- returned_string += str(i) + separator
- print(returned_string)
- returned_string = returned_string[:-len(separator)]
- return returned_string
- # @deco_outer(how_many_times_outer) # kolokrát chci opakovat výpis celého odpočtu, volání přes @ (syntaktický cukr)
- def countup(to_num, separator="+"):
- returned_string = ""
- for i in range(1, 1+to_num):
- returned_string += str(i) + separator
- print(returned_string)
- returned_string = returned_string[:-len(separator)]
- return returned_string
- print("-" * 20 + "Start programu" + "-" * 20)
- from_num_outer = 3
- print("-" * 20 + f"Výpis odpočtu ({how_many_times_outer}x od {from_num_outer} do 0 defaultně)" + "-" * 20)
- x = countdown(from_num_outer,".")
- how_many_times_outer = 5
- to_num_outer = 3
- print("Původní funkce: ", countup.__name__)
- countup = deco_outer(how_many_times_outer)(countup) # chci pětkrát opakovat výpis celého odpočtu, volání klasicky jako řetězené funkce, takže countup už není původní funkce, ale jiná!!!
- print("Zdekorovaná funkce: ", countup.__name__)
- print("+" * 20 + f"Výpis odpočtu ({how_many_times_outer}x od 1 do {to_num_outer} defaultně)" + "+" * 20)
- y = countup(to_num_outer, "++")
- print("=" * 20 + "Návratové hodnoty obou volaných funkcí" + "=" * 20)
- print(x)
- print(y)
- # %%
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement