Flask<1>--Decorator

Since Flask uses route() decorator to bind a function to a URL (Routing), this blog gives naive decorators and its corresponding code without decorator.

Level 1 (no parameters)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def wrapper(func):
def inner():
print("start")
func()
print("end")
return inner


def log():
print("logging")


log = wrapper(log)
log()

Corresponding decorator :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def wrapper(func):
def inner():
print("start")
func()
print("end")
return inner


@wrapper
def log():
print("logging")


log()

output:
start
logging
end

Level 2 (require parameter for log)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def wrapper(func):
def inner(file_name):
print("start")
func(file_name)
print("end")
return inner


def log(file_name):
print("logging " + file_name)


log = wrapper(log)
log('file')

Corresponding decorator :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def wrapper(func):
def inner(file_name):
print("start")
func(file_name)
print("end")
return inner


@wrapper
def log(file_name):
print("logging " + file_name)


log('file')

output:
start
logging file
end

Level 3 (Require parameter for decorator)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def wrapper(path_name):
def decorator(func):
def inner():
print("start logging in " + path_name)
func()
print("end")
return inner
return decorator


def log():
print("logging")


log = wrapper('path')(log)
log()

Corresponding decorator:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def wrapper(path_name):
def decorator(func):
def inner():
print("start logging in " + path_name)
func()
print("end")
return inner
return decorator


@wrapper("path")
def log():
print("logging")


log()

output:
start logging in path
logging
end

Level 4 (Require parameter for decorator&log)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def wrapper(path_name):
def decorator(func):
def inner(file_name):
print("start logging in " + path_name)
func(file_name)
print("end")
return inner
return decorator


def log(file_name):
print("logging " + file_name)


log = wrapper('path')(log)
log('file')

Corresponding decorator :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def wrapper(path_name):
def decorator(func):
def inner(file_name):
print("start logging in " + path_name)
func(file_name)
print("end")
return inner
return decorator


@wrapper('path')
def log(file_name):
print("logging " + file_name)


log('file')

output:
start logging in path
logging file
end