-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy path03-interlude_decorators.py
More file actions
49 lines (37 loc) · 924 Bytes
/
03-interlude_decorators.py
File metadata and controls
49 lines (37 loc) · 924 Bytes
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
from functools import wraps
import logging
import time
def timeit(logger):
def wrapper(fn):
@wraps(fn)
def inner_wrapper(*args, **kwargs):
t0 = time.time()
result = fn(*args, **kwargs)
logger(f'{fn.__name__} took {time.time() - t0:.02f} seconds')
return result
return inner_wrapper
return wrapper
@timeit(print)
def foo(n):
time.sleep(n)
return n
@timeit(logging.warning)
def bar(n):
time.sleep(n)
return n
def time_all(logger):
def wrapper(cls):
for name, obj in vars(cls).items():
if not name.startswith('_') and callable(obj):
setattr(cls, name, timeit(logger)(obj))
return cls
return wrapper
@time_all(print)
class Foo:
def bar(self, n):
time.sleep(n)
return n
def baz(self, n):
m = n * 2
time.sleep(m)
return m