-
Notifications
You must be signed in to change notification settings - Fork 0
/
cazzola.py
103 lines (88 loc) · 2.45 KB
/
cazzola.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import time
import traceback
import types
class _memoization:
def __init__(self):
self.cached_keys = []
self.cached_results = []
def __call__(self, f):
def _f(*args,**kwargs):
if (f,args,kwargs) in self.cached_keys:
print('Lucky you!, retrieving from cache.')
print('Getting {}'.format((f,args,kwargs)))
ix = self.cached_keys.index((f,args,kwargs))
return self.cached_results[ix]
result = f(*args,**kwargs)
self.cached_keys.append((f,args,kwargs))
self.cached_results.append(result)
## Simulating hard computation
## when caching was useless ...
time.sleep(0.5)
return result
return _f
memoization = _memoization()
@memoization
def f(a, b):
return a+b
@memoization
def g(a):
return 100 + a
@memoization
def _sum(lst,cntr=0):
if len(lst) < 1: return cntr
return _sum(lst[1:], lst[0]+cntr)
class MyMathMeta(type):
print('Creating cache...',end=' ')
memoization = _memoization()
print('Done!')
def __new__(meta, classname, supers, classdict):
for k,v in classdict.items():
if type(v) is types.FunctionType:
classdict[k] = memoization(v)
return type.__new__(meta, classname, supers, classdict)
class MyMath(metaclass=MyMathMeta):
def fib(self,n):
'''
Returns the nth # of Fibonacci's
'''
if n==0 or n==1: return 1
return self.fib(n-1) + self.fib(n-2)
def fact(self, n):
'''
Returns n!
'''
if n==0: return 1
return self.fact(n-1) * n
def stack_trace(f):
def _f(*args, **kwargs):
traceback.print_stack()
return f(*args, **kwargs)
return _f
def dummy_wrapper(f):
def _f(*args,**kwargs): return f(*args,**kwargs)
return _f
@dummy_wrapper
@dummy_wrapper
@dummy_wrapper
@dummy_wrapper
@dummy_wrapper
@dummy_wrapper
@dummy_wrapper
@dummy_wrapper
@dummy_wrapper
@dummy_wrapper
@stack_trace
def f(a, b):
return a + b
class _logging:
def __init__(self, fname):
self.fdata = open(fname, 'a')
def __call__(self, f):
def _f(*args, **kwargs):
self.fdata.write('Called {} with arguments: {} {}\n'.format(f, args, kwargs))
self.fdata.flush()
return f(*args, **kwargs)
return _f
logging = _logging('log.txt')
@logging
def f(a, b): return a + b