1 # -*- coding: utf-8 -*-
2
3 from functools import wraps
4 from inspect import isfunction
5
6 def beforecalled(*args, **kwargs):
7 print('before called! {}'.format(len(args)))
8
9 for arg in args:
10 print(arg)
11
12 def aftercalled(*args, **kwargs):
13 print('after called! {}'.format(len(args)))
14 for k,v in kwargs.iteritems():
15 print('{0}={1}'.format(k,v))
16
17 jclist=['-' for _ in xrange(20)]
18 print(''.join(jclist))
19
20 def logdeco(*decoargs, **decokwargs):
21 def decotator(func):
22 @wraps(func)
23 def wrapper(*funcargs, **funckwargs):
24 beforecalled(*decoargs, **decokwargs)
25 result = func(*funcargs, **funckwargs)
26 aftercalled(*decoargs, **decokwargs)
27 return result
28 return wrapper
29 return decotator
30
31 def log(*decoargs, **decokwargs):
32 if len(decoargs)==1 and len(decokwargs)==0:
33 if isfunction(decoargs[0]) or hasattr(decoargs[0],'__call__'):
34 return logdeco()(decoargs[0])
35
36 def wrappered(func):
37 return logdeco(*decoargs, **decokwargs)(func)
38
39 return wrappered
40
41 @log('lisa',50,email='lisa@xxx.com')
42 def testmoreparas(x,y):
43 print('x*y={}'.format(x*y))
44
45 @log()
46 def testemptypara(x,y):
47 print('x*y={}'.format(x*y))
48
49 @log
50 def testjustlog(x,y):
51 print('x*y={}'.format(x*y))
52
53 if __name__=='__main__':
54 testmoreparas(5,6)
55 testemptypara(4,5)
56 testjustlog(3,4)