-
Notifications
You must be signed in to change notification settings - Fork 0
/
How to call wrapper functions 1.py
161 lines (156 loc) · 4.18 KB
/
How to call wrapper functions 1.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
def deco(anything):
"""Nodes are marked by random functions (here print()), functions involving \
input parameter (here the function "anything"), and the input function \
"anything" itself.
"""
type(anything)
anything print("another print")
print("report start.")
def wrapper(self,*arg,**kwarg):
print(type(wrapper))
print("point 1: wrapper initiated")
anything(self,*arg,**kwarg)
print("input func executed, about to end wrapper.")
return wrapper
print("wrapper ends")
type(anything)
anything
print("report2 started")
def wrapper2(self,*arg,**kwarg):
print(type(wrapper))
print("point 2: wrapper initiated")
anything(self,*arg,**kwarg)
print("input2 func executed, about to end wrapper2.")
return wrapper2
print("wrappers ends")
type(anything)
anything
@deco
def func(another):
print("the function has been initiated")
print("function for {}".format(another))
print("the function has been terminated.")
# It returns :
#
# "
# another print
# report start.
# "
#
# Which indicates that by calling "@deco" and defining the input function, we
# are evoking the deco(anything) itself, until the wrapper function
# "wrapper(self, *arg, **kwarg")". After wrapper(self, *arg, **kwarg) has been
# defined, the parent function "deco(anything)" is halted.
func("parameter1")
# It returns :
#
# "
#<class 'function'>
# point 1: wrapper initiated
# the function has been initiated
# function for parameter1
# the function has been terminated.
# input func executed, about to end wrapper.
# "
#
# which means that deco(anything) is run until the first wrapper (and only
# the first wrapper) has been executed (at "return wrapper"). After that,
# deco(anything) is halted, and any function after the return of the first
# wrapper is omitted..
def deco(anything):
type(anything)
anything
print("another print")
print("report2 started")
def wrapper2(self,*arg,**kwarg):
print(type(wrapper2))
print("point 2: wrapper initiated")
anything(self,*arg,**kwarg)
print("input2 func executed, about to end wrapper2.")
return wrapper2
print("wrapper2 ends")
type(anything)
anything
print("report start.")
def wrapper(self,*arg,**kwarg):
print(type(wrapper))
print("point 1: wrapper initiated")
anything(self,*arg,**kwarg)
print("input func executed, about to end wrapper.")
return wrapper
print("wrapper ends")
type(anything)
anything
@deco
def func(another):
print("the function has been initiated")
print("function for {}".format(another))
print("the function has been terminated.")
# It returns :
#
# "
# another print
# report2 started
# "
func("parameter1")
# It returns :
#
# "
# <class 'function'>
# point 2: wrapper initiated
# The function has been initiated
# function for parameter1
# the function has been terminated.
# input2 func executed, about to end wrapper2.
# "
# which proves that "wrapper" the name is not necessary for the
# function that actually runs as a wrapper. Here the wrapper for
# func(another) is the function wrapper2.
def deco(anything):
type(anything)
anything
print("another print")
print("report2 started")
def wrapper2(*arg,**kwarg):
print(type(wrapper2))
print("point 2: wrapper initiated")
anything(*arg,**kwarg)
print("input2 func executed, about to end wrapper2.")
return wrapper2
print("wrapper2 ends")
type(anything)
anything
print("report start.")
def wrapper(*arg,**kwarg):
print(type(wrapper))
print("point 1: wrapper initiated")
anything(*arg,**kwarg)
print("input func executed, about to end wrapper.")
return wrapper
print("wrapper ends")
type(anything)
anything
@deco
def func(another):
print("the function has been initiated")
print("function for {}".format(another))
print("the function has been terminated.")
# It returns :
#
# "
# another print
# report2 started
# "
func("parameter23")
# It returns :
#
# "
# <class 'function'>
# point 2: wrapper initiated
# The function has been initiated
# function for parameter23
# the function has been terminated.
# input2 func executed, about to end wrapper2.
# "
#
# Why the self parameter in wrapper2 did not break the function?