Как вернуть значения функций, вызванных с помощью yield в ContextManager - Python

Я пытаюсь упорядочить свой код, удалив много повторяющейся логики. Мне кажется, что это было бы отличным вариантом использования контекстного менеджера.

При внесении определенных обновлений в систему всегда происходят 4 вещи -

  1. Мы блокируем ресурс, чтобы предотвратить одновременное обновление
  2. Мы оборачиваем нашу логику в транзакцию базы данных
  3. Мы проверяем данные, убеждаясь, что обновление допустимо
  4. После выполнения функции мы добавляем строки истории в базу данных

Мне нужна обертка для инкапсуляции этого, как показано ниже

from contextlib import contextmanager

@contextmanager
def my_manager(resource_id):
    try:
        with lock(resource_id), transaction.atomic():
            validate_data(resource_id)

            resources = yield 

            create_history_objects(resources)
    except LockError:
        raise CustomError

def update(resource_id):
    with my_manager(resource_id):
        _update(resource_id)

def _update(resource_id):
   # do something 
   return resource

Все работает как ожидалось, за исключением возможности доступа к ресурсам в контекстном менеджере, которые являются None. Ресурсы возвращаются из функции, которая вызывается во время оператора yield.

Каким образом можно получить доступ к этим ресурсам через yield или другую утилиту? Спасибо

Вернуться на верх