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 装饰器(装饰器的简单使用)