Advertisement
Acer1968

Dekorátor s parametrem

Jul 20th, 2021
988
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.71 KB | None | 0 0
  1. # %%
  2. def deco_outer(how_many_times):
  3.     """
  4.    Dekorátor (vnější s parametrem), který zavolá dekorovanou funkci tolikrát, kolikrát mu to zadám.
  5.    """
  6.     def deco_inner(func):
  7.         """
  8.        Dekorátor (vnitřní s volanou funkcí), vrací zřejmě tu pozměněnou původní funkci
  9.        """
  10.         def wrapper(*args, **kwargs):
  11.             """
  12.            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.
  13.            """
  14.             for i in range(how_many_times):
  15.                 print("Spouštím odpočítávání číslo: " + str(i + 1))
  16.                 return_values = func(*args, **kwargs)
  17.                 print("Získané pojmenované argumenty: ", kwargs) # dostávám prázdný slovník, jak se dostanu k separátoru původní funkce?
  18.                 end_message = "Skončilo odpočítávání číslo: " + str(i + 1)
  19.                 print(end_message)
  20.                 print(return_values[-1]*len(end_message))
  21.             return return_values
  22.         return wrapper
  23.     return deco_inner
  24.  
  25. # %%
  26. how_many_times_outer = 2
  27. @deco_outer(how_many_times_outer)
  28. def countdown(from_num, separator="-"):
  29.     returned_string = ""
  30.     for i in range(from_num, -1, -1):
  31.         returned_string += str(i) + separator
  32.         print(returned_string)
  33.     returned_string = returned_string[:-len(separator)]
  34.     return returned_string
  35.  
  36. # @deco_outer(how_many_times_outer) # kolokrát chci opakovat výpis celého odpočtu, volání přes @ (syntaktický cukr)
  37.  
  38.  
  39. def countup(to_num, separator="+"):
  40.     returned_string = ""
  41.     for i in range(1, 1+to_num):
  42.         returned_string += str(i) + separator
  43.         print(returned_string)
  44.     returned_string = returned_string[:-len(separator)]
  45.     return returned_string
  46.  
  47.  
  48. print("-" * 20 + "Start programu" + "-" * 20)
  49.  
  50.  
  51. from_num_outer = 3
  52. print("-" * 20 + f"Výpis odpočtu ({how_many_times_outer}x od {from_num_outer} do 0 defaultně)" + "-" * 20)
  53. x = countdown(from_num_outer,".")
  54.  
  55.  
  56. how_many_times_outer = 5
  57. to_num_outer = 3
  58.  
  59. print("Původní funkce: ", countup.__name__)
  60. 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á!!!
  61. print("Zdekorovaná funkce: ", countup.__name__)
  62. print("+" * 20 + f"Výpis odpočtu ({how_many_times_outer}x od 1 do {to_num_outer} defaultně)" + "+" * 20)
  63. y = countup(to_num_outer, "++")
  64. print("=" * 20 + "Návratové hodnoty obou volaných funkcí" + "=" * 20)
  65. print(x)
  66. print(y)
  67. # %%
  68.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement