将参数传递给上下文管理器

bjg7j2ky  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(302)

有没有使用上下文管理器传递参数的方法?以下是我想做的:

async with self.request.app['expiration_lock']('param'):

但我得到了一个错误:

TypeError: 'OrderStatusLock' object is not callable

类orderstatuslock:

class OrderStatusLock(_ContextManagerMixin, Lock):
    def __init__(self, *args, loop=None):
        print(args)
        self._waiters = None
        self._locked = False
        if loop is None:
            self._loop = events.get_event_loop()
        else:
            self._loop = loop

    async def acquire(self, *args):
        print('acq', args)
        if (not self._locked and (self._waiters is None or
                all(w.cancelled() for w in self._waiters))):
            self._locked = True
            return True

        if self._waiters is None:
            self._waiters = collections.deque()
        fut = self._loop.create_future()
        self._waiters.append(fut)
        try:
            try:
                await fut
            finally:
                self._waiters.remove(fut)
        except CancelledError:
            if not self._locked:
                self._wake_up_first()
            raise

        self._locked = True
        return True

如果可能的话,我可以用这个来面对什么问题?非常感谢你。

sd2nnvve

sd2nnvve1#

你的问题有很多,我不知道你的答案在哪里 _ContextManagerMixin 班级来自中国。我对异步也不太了解。
然而,这里有一个简单的(非异步)模式演示,其中一个参数可以传递给上下文管理器,从而改变 __enter__ 上下文管理器的方法进行操作。
请记住:上下文管理器的核心只是一个实现 __enter__ 方法与示例 __exit__ 方法。这个 __enter__ 方法在 with 块,和 __exit__ 方法的末尾调用 with
这个 __call__ 在我的示例类中添加的方法在 __enter__ 方法和,与 __enter__ 方法,可以使用参数调用。这个 __exit__ 方法负责清理 __call__ 方法和步骤 __enter__ 方法。

from threading import Lock

class LockWrapper:
    def __init__(self):
        self.lock = Lock()
        self.food = ''

    def __enter__(self):
        self.lock.acquire()
        print(f'{self.food} for breakfast, please!')
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.lock.release()
        self.food = ''
        return True

    def __call__(self, spam_preferred: bool):
        if spam_preferred:
            self.food = 'Spam'
        else:
            self.food = 'Eggs'
        return self

breakfast_context_manager = LockWrapper()

with breakfast_context_manager(spam_preferred=True):    # prints 'Spam for breakfast, please!'
    pass

with breakfast_context_manager(spam_preferred=False):    # prints 'Eggs for breakfast, please!'
    pass

n、 b.我上面的示例将抑制在 with 陈述如果不想抑制任何异常,或者只想抑制某些类型的异常,则需要更改 __exit__ 方法。
还要注意,这些函数的返回值非常重要。 __call__ 我必须回去 self 如果您希望该类能够调用 __enter__ . __enter__ 我必须回去 self 如果希望能够访问 with 陈述 __exit__ 应该回来 True 如果希望抑制异常,以及 False 如果您希望遇到的异常继续在 with 陈述
这里有一个很好的上下文管理器教程,其中还包含一些关于如何使用 __aenter____aexit__ 方法:https://realpython.com/python-with-statement/

相关问题