Как написать менеджер контекста с contextlib.contextmanager, где я только войти в систему при сбое - PullRequest
1 голос
/ 31 мая 2019

Я пытаюсь написать менеджер контекста с contextlib.contextmanager.Следующее работает как ожидалось:

from pathlib import Path
from contextlib import contextmanager

@contextmanager
def Dir(path):
    path = Path(path).expanduser().resolve()
    try:
        path.mkdir(parents=True, exist_ok=True)
        yield path
    except PermissionError as err:
        print(err)
        raise err

Однако, если я хочу, чтобы оно регистрировало и подавляло исключение, удаляя строку raise err, я получаю следующую ошибку:

/usr/lib64/python3.7/contextlib.py in __enter__(self)
    112             return next(self.gen)
    113         except StopIteration:
--> 114             raise RuntimeError("generator didn't yield") from None
    115 
    116     def __exit__(self, type, value, traceback):

RuntimeError: generator didn't yield

Чтоя пропустил?

PS: мне известен этот старый вопрос, но он не решил мою проблему.

1 Ответ

0 голосов
/ 31 мая 2019

Проблема в том, что он терпит неудачу, если не дает результата (поскольку он потерпит неудачу в строке path.mkdir(parents=True, exist_ok=True) непосредственно перед сдачей), поэтому просто добавьте доходность в блоке кроме:

@contextmanager
def Dir(path):
    path = Path(path).expanduser().resolve()
    try:
        path.mkdir(parents=True, exist_ok=True)
        yield path
    except PermissionError as err:
        print(err)
        yield path

Или просто:

@contextmanager
def Dir(path):
    path = Path(path).expanduser().resolve()
    try:
        path.mkdir(parents=True, exist_ok=True)
    except PermissionError as err:
        print(err)
    yield path
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...