Python/Decorator: Difference between revisions
< Python
Jump to navigation
Jump to search
(Created page with "<source lang="python"> def pre_hook(func): def wrapper(*args): a = args[0] + 1 b = args[1] + 1 return func(a, b) return wrapper </source> <sou...") |
No edit summary |
||
| (3 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
{| class="wikitable" | |||
! TODO || Code | |||
|- | |||
| Using build function to create a decorator. | |||
| | |||
<source lang="python"> | |||
import datetime | |||
import time | |||
def build_decorator(func, wrapper): | |||
def func_wrapper(*args, **kwargs): | |||
return wrapper(*args, **kwargs) | |||
def class_wrapper(func): | |||
def method_wrapper(*args, **kwargs): | |||
return wrapper(*args, **kwargs) | |||
if func is None: | |||
return class_wrapper | |||
return func_wrapper | |||
def print_time(func, suffix = '>>'): | |||
def wrapper(*args, **kwargs): | |||
isotime = datetime.datetime.now().strftime('%H:%M:%S') | |||
print('begin at:', isotime, suffix) | |||
func(*args, **kwargs) | |||
isotime = datetime.datetime.now().strftime('%H:%M:%S') | |||
print('end at:', isotime, suffix) | |||
return build_decorator(func, wrapper) | |||
@print_time | |||
def func_job(a, b=1): | |||
print('a={}, b={}'.format(a, b)) | |||
time.sleep(1) | |||
class Something: | |||
@print_time | |||
def method_job(self, c, d=1): | |||
print('c={}, d={}'.format(c, d)) | |||
time.sleep(1) | |||
func_job(1, b=3) | |||
Something().method_job(2, d=4) | |||
</source> | |||
|- | |||
| | |||
| | |||
<source lang="python"> | <source lang="python"> | ||
def pre_hook(func): | def pre_hook(func): | ||
| Line 7: | Line 52: | ||
return wrapper | return wrapper | ||
</source> | </source> | ||
|- | |||
| | |||
| | |||
<source lang="python"> | <source lang="python"> | ||
def post_hook(func): | def post_hook(func): | ||
| Line 14: | Line 61: | ||
return wrapper | return wrapper | ||
</source> | </source> | ||
|- | |||
| | |||
| | |||
<source lang="python"> | <source lang="python"> | ||
def duo_hook(func): | def duo_hook(func): | ||
| Line 25: | Line 74: | ||
return wrapper | return wrapper | ||
</source> | </source> | ||
|- | |||
| | |||
| | |||
<source lang="python"> | |||
def mydeco(func=None, name='default'): | |||
state = { | |||
'begin': 0 | |||
} | |||
def pre_task(): | |||
state['begin'] = time.time() | |||
print('name=%s' % name) | |||
def post_task(): | |||
elapsed = time.time() - state['begin'] | |||
print('elapsed=%.2f' % elapsed) | |||
def func_wrapper(*args): | |||
pre_task() | |||
fret = func(*args) | |||
post_task() | |||
return fret | |||
def deco_wrapper(func): | |||
def func_wrapper(*args): | |||
pre_task() | |||
fret = func(*args) | |||
post_task() | |||
return fret | |||
return func_wrapper | |||
return deco_wrapper if func is None else func_wrapper | |||
@mydeco | |||
def test1(): | |||
time.sleep(3) | |||
@mydeco(name="noname") | |||
def test2(): | |||
time.sleep(1) | |||
</source> | |||
|} | |||
Latest revision as of 05:53, 24 December 2020
| TODO | Code |
|---|---|
| Using build function to create a decorator. |
import datetime
import time
def build_decorator(func, wrapper):
def func_wrapper(*args, **kwargs):
return wrapper(*args, **kwargs)
def class_wrapper(func):
def method_wrapper(*args, **kwargs):
return wrapper(*args, **kwargs)
if func is None:
return class_wrapper
return func_wrapper
def print_time(func, suffix = '>>'):
def wrapper(*args, **kwargs):
isotime = datetime.datetime.now().strftime('%H:%M:%S')
print('begin at:', isotime, suffix)
func(*args, **kwargs)
isotime = datetime.datetime.now().strftime('%H:%M:%S')
print('end at:', isotime, suffix)
return build_decorator(func, wrapper)
@print_time
def func_job(a, b=1):
print('a={}, b={}'.format(a, b))
time.sleep(1)
class Something:
@print_time
def method_job(self, c, d=1):
print('c={}, d={}'.format(c, d))
time.sleep(1)
func_job(1, b=3)
Something().method_job(2, d=4)
|
def pre_hook(func):
def wrapper(*args):
a = args[0] + 1
b = args[1] + 1
return func(a, b)
return wrapper
| |
def post_hook(func):
def wrapper(*args):
print(func(*args))
return wrapper
| |
def duo_hook(func):
def wrapper(*args):
a = args[0] + 1
b = args[1] + 1
sum = func(a, b)
print(sum)
return sum
return wrapper
| |
def mydeco(func=None, name='default'):
state = {
'begin': 0
}
def pre_task():
state['begin'] = time.time()
print('name=%s' % name)
def post_task():
elapsed = time.time() - state['begin']
print('elapsed=%.2f' % elapsed)
def func_wrapper(*args):
pre_task()
fret = func(*args)
post_task()
return fret
def deco_wrapper(func):
def func_wrapper(*args):
pre_task()
fret = func(*args)
post_task()
return fret
return func_wrapper
return deco_wrapper if func is None else func_wrapper
@mydeco
def test1():
time.sleep(3)
@mydeco(name="noname")
def test2():
time.sleep(1)
|