python 定义可用作装饰器的上下文管理器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 定义可用作装饰器的上下文管理器相关的知识,希望对你有一定的参考价值。
# USAGE
@track_entry_and_exit('widget loader')
def activity():
print('Some time consuming activity goes here')
load_widget()
with track_entry_and_exit('widget loader'):
print('Some time consuming activity goes here')
load_widget()
# PYTHON 3
from contextlib import ContextDecorator
class track_entry_and_exit(ContextDecorator):
def __init__(self, name):
self.name = name
def __enter__(self):
logging.info('Entering: {}'.format(self.name))
def __exit__(self, exc_type, exc, exc_tb):
logging.info('Exiting: {}'.format(self.name))
# PYTHON 2
class track_entry_and_exit(object):
def __init__(self, name):
self.name = name
def __call__(self, fn):
@functools.wraps(fn)
def wrapper(*args, **kwargs):
with self:
return fn(*args, **kwargs)
return wrapper
def __enter__(self):
logging.info('Entering: {}'.format(self.name))
def __exit__(self, err_type, value, traceback):
logging.info('Exiting: {}'.format(self.name))
# MOCK.PATCH EXAMPLE
class testcase(object):
def __init__(self):
self.patcher = mock.patch('something', autospec=True)
def __call__(self, fn):
@functools.wraps(fn)
def wrapper(*args, **kwargs):
with self:
return fn(*args, **kwargs)
return wrapper
def __enter__(self):
self.patcher.start()
def __exit__(self, err_type, value, traceback):
self.patcher.stop()
# note: @testcase(), even if without arguments
以上是关于python 定义可用作装饰器的上下文管理器的主要内容,如果未能解决你的问题,请参考以下文章
[新星计划] Python上下文管理器 | with关键字
[新星计划] Python上下文管理器 | with关键字
[新星计划] Python上下文管理器 | with关键字
Python学习日记简单了解迭代器生成器装饰器上下文管理器
python中的上下文管理器
Python 装饰器(装饰器的简单使用)