Мне трудно писать чистый код с контекстными менеджерами в Python, не попадая в администратор контекста. Представьте себе что-то вроде: < /p>
Код: Выделить всё
class A:
def __init__(self):
self.b = B() # where B is a context manager
сейчас утечка, потому что я не использовал оператор с . В дикой природе я видел две решения для этого:
[*] inject b в классе и иметь некоторые внешние с ratport
Создайте контекстный менеджер, который также реализует закрытие b :
Код: Выделить всё
with A() as a:
...
# A will close B now in its __exit__ method
< /code>
< /li>
< /ol>
Мне не нравится оба метода. В моем примере использование B
внутри является детализацией реализации. Это не то, что я хочу подвергнуть внешнему миру. Таким образом, вариант 1, очевидно, не подходит, но даже вариант 2 раскрывает некоторые детали. Главным образом, что А делает какое -то управление ресурсами. Кроме того, необходимость вручную реализовать метод __exit __ , кажется, немного побеждает цель, чтобы быть менеджером контекста, если я не могу использовать синтаксис менеджера контекста. Итак, как я могу избежать создания всех моих контекстных менеджеров в моих классах, если есть цепочка зависимостей? Таким образом, у меня может быть агент класса , который может выполнить код. Это делается с ноутбуком Jupyter. Таким образом, моей программе нужен работает сервер ноутбуков Jupyter. В идеале я хотел бы инкапсулировать это в классе агента. Класс агента запускает сервер и останавливает сервер. Сервер здесь реализован как диспетчер контекста. Решение, которое я бы придумал, - это делает агента теперь менеджером контекста, которое мне не нравится. Потому что тогда какой -то класс, использующий агента, тоже должен стать менеджером контекста, ... так что в конце концов моя программа - менеджер контекста.
Подробнее здесь:
https://stackoverflow.com/questions/793 ... attributes