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)
View Code

相关文章: