-
Notifications
You must be signed in to change notification settings - Fork 52
/
learning_decorators.py
93 lines (69 loc) · 1.98 KB
/
learning_decorators.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
"""
Code learned from tutorial at:
https://github.com/google/py-decorators-tutorial
"""
from functools import wraps
def is_number(n):
try:
float(n)
return True
except ValueError:
return False
def validate_two_arguments(n1, n2):
if not (is_number(n1) and is_number(n2)):
return False
return True
def convert_arguments_to(to_type=float):
def _wrapper(func):
def _wrapped_func(*args):
new_args = [to_type(arg) for arg in args]
return func(*new_args)
return _wrapped_func
return _wrapper
def validate_arguments(func):
def wrapped_func(*args):
for arg in args:
if not is_number(arg):
raise Exception("Arguments must be numbers!")
if len(args) < 2:
raise Exception("Must specify at least 2 arguments!")
return func(*args)
return wrapped_func
def better_validate_arguments(func):
@wraps(func)
def wrapped_func(*args):
for arg in args:
if not is_number(arg):
raise Exception("Arguments must be numbers!")
if len(args) < 2:
raise Exception("Must specify at least 2 arguments!")
return func(*args)
return wrapped_func
def jedi_mini_trick(func):
def _jedi_func():
return "Not the droid yo're looking for!"
return _jedi_func
@validate_arguments
def add(*args):
return sum(args)
@validate_arguments
def divide_n(*args):
cumu = args[0]
for arg in args[1:]:
cumu /= arg
return cumu
# Both of the functions below will give the same result because Python3 doesn't
# do integer division by default.
@convert_arguments_to(to_type=float)
def divide_n_as_floats(*args):
return divide_n(*args)
@convert_arguments_to(to_type=int)
def divide_n_as_integers(*args):
return divide_n(*args)
@better_validate_arguments
def bar(*args):
"""Bar frobs foo"""
print(args)
@jedi_mini_trick
def get_droid():
print("Found the droid!")