1、装饰器
from functools import wraps
import datetime
def logging(func):
@wraps(func)
def wrapper(*args, **kwargs):
"""print log before a function."""
print('[DEBUG] {}: enter {}()'.format(datetime.now(), func.__name__))
return func(*args, **kwargs)
return wrapper
@logging
def say(something):
"""say something"""
print('say {}!'.format(something))
print(say.__name__) # say
print(say.__doc__) # say something
2、带参数的装饰器
class logging(object):
def __init__(self, level='INFO'):
self.level = level
def __call__(self, func): # 接受函数
def wrapper(*args, **kwargs):
print('[{level}]: enter function {func}()'.format(
level=self.level,
func=func.__name__))
func(*args, **kwargs)
return wrapper # 返回函数
@logging(level='INFO')
def say(something):
print('say {}'.format(something))
say('love you.')
print(say.__name__) # wrapper
3、多层函数嵌套
import threading, sys
def nested1(timeout):
def _1(function):
def _2(*args,**kw):
class child(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.result=None
self.error = None
self.setDaemon(True)
self.start()
def run(self):
try:
self.result = function(*args, **kw)
except:
self.error = sys.exc_info()
c = child()
c.join(timeout)
if c.isAlive():
raise TimeoutError, 'took too long'
if c.error:
raise c.error[0], c.error[1]
return c.result
return _2
return _1
def test(a, b):
for i in xrange(100000):
a = a+b
return a
if __name__ == '__main__':
nested1 = nested1(2)
nested2 = nested1(test)
print nested2(2,3)
a = nested2.child()
print a