python自定义修饰器_python 自定义装饰器

提醒用户使用了废弃的函数

def deprecated(func):

"""This decorator is used to mark functions as deprecated.

It will result in a warning being emitted when the function is used.

"""

@functools.wraps(func)

def new_func(*args, **kwargs):

warnings.simplefilter('always', DeprecationWarning) # turn off filter

warnings.warn(

"Call to deprecated function {}.".format(func.__name__),

category=DeprecationWarning,

stacklevel=2

)

warnings.simplefilter('default', DeprecationWarning) # reset filter

return func(*args, **kwargs)

return new_func

装饰类中函数的装饰器,给函数增加报错功能

# 装饰类中函数的装饰器第一个参数是self

def connection_closed_handler(function):

"""Handle ConnectionClosedException."""

@wraps(function)

def _wrap(inst, *args, **kwargs):

try:

return function(inst, *args, **kwargs)

except (ConnectionClosedException, WebSocketConnectionClosedException):

inst.logger.warn("the connection lost. Resetting ...")

inst.reset(args[1])

return function(inst, *args, **kwargs)

return _wrap

两层装饰器写法

def timelimited(timeout):

def decorator(function):

def decorator2(*args, **kwargs):

class TimeLimited(Thread):

def __init__(self, _error=None, ):

Thread.__init__(self)

self._error = _error

def run(self):

try:

self.result = function(*args, **kwargs)

except Exception as e:

self._error = str(e)

def _stop(self):

if self.is_alive():

ThreadStop(self)

t = TimeLimited()

t.start()

t.join(timeout)

if isinstance(t._error, TimeoutException):

t._stop()

raise TimeoutException('timeout for %s' % (repr(function)))

if t.is_alive():

t._stop()

raise TimeoutException('timeout for %s' % (repr(function)))

if t._error is None:

return t.result

return decorator2

return decorator

你可能感兴趣的:(python自定义修饰器)