-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDecorators.py
283 lines (133 loc) · 3.6 KB
/
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
#!/usr/bin/env python
# coding: utf-8
# In[1]:
# imagine you create simple function
# In[3]:
# def simple_function():
# do simple function
# return something
# In[4]:
# now you created a simple function noy you want to add more functonality to it
# solution is (Simple)
# def simple_function():
# more code
# do simple function
# return something
# now you have two options
# 1) add more code to older funtion
# 2) create new function that contains older code and add new code
# its not ideeal to copy pase to other function
# but what if you need to remove extra functionally and get back again to older function
# how can achieve this somw switch on/off ?
# In[5]:
# python has decorators who allows us to take extra functionality to an already existing function
# they use @ operator and are then placed on tp of the origional function
# In[20]:
def hello():
return 'Hello !'
# In[21]:
hello()
# In[22]:
greet = hello
# In[23]:
greet()
# In[24]:
# when you will delete hello than can no execute hello now
del hello
# In[25]:
hello()
# In[28]:
# but greet still return hello because greet reference the hello
greet()
# In[35]:
def hello():
print("hello () function called")
def greet():
return 'greet'
def welcome():
return 'welocme'
print(greet())
print(welcome())
print('This is the end of the function')
# In[36]:
hello()
# In[37]:
def hello(name = 'Uzair'):
print("hello () function called")
def greet():
return 'greet'
def welcome():
return 'welocme'
if name == 'Uzair':
return greet()
else:
return welcome()
print('This is the end of the function')
# In[38]:
hello()
# In[39]:
# what is the good way ?
# make some function and pass to an another function
def hello():
print("hello")
# In[40]:
def other(some_func):
print("other code run")
print(some_func())
# In[43]:
other(hello)
# In[73]:
# we use decorators for it to put extra functionality of function to other function
def new_decorator (originonal_function):
def wrap_func():
print("some extra code before the original function")
originonal_function()
print("some extra code after the original function")
return wrap_func
def hello_world(originonal_function):
print("hello world")
return originonal_function
# In[74]:
# calling decorator function to another function
@hello_world
@new_decorator
def function_need_decorator():
print("I want to be decorated")
function_need_decorator()
# In[75]:
def uppercase_decorator(function):
def wrapper():
func = function()
make_uppercase = func.upper()
return make_uppercase
return wrapper
# In[85]:
@uppercase_decorator
def my_name():
return "uzair"
# In[86]:
my_name()
# In[92]:
def splitting(function):
def wrapper():
return function().split()
return wrapper
# In[93]:
@splitting
@uppercase_decorator
def my_name():
return "uzair"
# In[94]:
my_name()
# In[95]:
# Arguments in Decorator Functions
def decorator_with_arguments(function):
def wrapper_accepting_arguments(arg1, arg2):
print("My arguments are: {0}, {1}".format(arg1,arg2))
function(arg1, arg2)
return wrapper_accepting_arguments
@decorator_with_arguments
def cities(city_one, city_two):
print("Cities I love are {0} and {1}".format(city_one, city_two))
cities("Nairobi", "Accra")
# In[ ]: