Poniżej przykład dla funkcji obliczającej rekurencyjnie silnię. Stworzone zostały dwa dekoratory. Pierwszy zajmuje się zapamiętywaniem obliczonych już wartości. Druga metoda drukuje na ekranie parametry wywołania funkcji. Fajny sposób na zapewnienie single responsibility principle.
def cache(fun): cache_map = {} def _f(*args): try: if args in cache_map: return cache_map[args] cache_map[args] = result = fun(*args) return result except: # some element of args can't be a dict key return fun(args) return _f def log(fun): def _f(*args): print('log: ' + fun.__name__ + '(' + str(*args) + ')') return fun(*args) return _f @cache @log def factorial(n): if n == 0: return 1 return n * factorial(n-1) assert factorial(3) == 6 assert factorial(1) == 1Wynik:
log: factorial(3) log: factorial(2) log: factorial(1) log: factorial(0)
Brak komentarzy:
Prześlij komentarz