Менеджеры контекста Python как атрибуты классаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Менеджеры контекста Python как атрибуты класса

Сообщение Anonymous »

Мне трудно писать чистый код с контекстными менеджерами на Python, не попадая в ад контекстного менеджера. Представьте себе что-то вроде:

Код: Выделить всё

class A:
def __init__(self):
self.b =  B() # where B is a context manager
Теперь эта информация просачивается, потому что я не использовал оператор with. В реальной жизни я видел два решения этой проблемы.

[*]Внедрить B в класс и использовать внешний оператор with

Код: Выделить всё

with B() as b:
a = A(b)
2. Сделайте A также менеджером контекста, который реализует закрытие B.

Код: Выделить всё

with A() as a:
...
# A will close B now in its __exit__ method
Мне не нравятся оба метода. В моем примере использование B внутри A является деталью реализации. Это не то, что я хочу показать внешнему миру. Таким образом, вариант 1 явно не подходит, но даже вариант 2 раскрывает некоторые детали. В основном то, что A осуществляет некоторое управление ресурсами. Кроме того, необходимость вручную реализовывать метод exit, похоже, несколько противоречит цели B быть менеджером контекста, если я не могу использовать синтаксис менеджера контекста.
Так что, я думаю, мне здесь не хватает C++ RAII, который напрямую не подходит для Python. Так как же мне избежать создания контекстных менеджеров практически для всех моих классов, если существует цепочка зависимостей?
Чтобы привести очень конкретный пример использования:
An Агент ML (например, ChatGPT) хочет выполнить код. Итак, у меня может быть класс Agent, который может выполнять код. Это делается с помощью блокнота Jupyter. Таким образом, моей программе нужен работающий сервер ноутбуков Jupyter. В идеале я хотел бы инкапсулировать это в классе агента. Класс агента запускает и останавливает сервер. Сервер здесь реализован как менеджер контекста. Решение, которое я придумал, — сделать Агента теперь еще и менеджером контекста, что мне не нравится. Потому что тогда какой-то класс, использующий Агент, тоже должен стать менеджером контекста... так что, в конце концов, вся моя программа является менеджером контекста.
Я чувствую, что у меня неправильный Pythonic думаю здесь, но слишком много думаю о C++. Поэтому мне интересно, как люди решат такую ​​проблему.

Подробнее здесь: https://stackoverflow.com/questions/793 ... attributes
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Менеджеры контекста как атрибуты
    Anonymous » » в форуме Python
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Менеджеры контекста как класс или функция?
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Менеджеры контекста как класс или функция?
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Контекстные менеджеры как атрибуты
    Anonymous » » в форуме Python
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Контекстные менеджеры как атрибуты
    Anonymous » » в форуме Python
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»