Как вернуть значения функций, вызванных с помощью yield в ContextManager - Python
Я пытаюсь упорядочить свой код, удалив много повторяющейся логики. Мне кажется, что это было бы отличным вариантом использования контекстного менеджера.
При внесении определенных обновлений в систему всегда происходят 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 или другую утилиту? Спасибо