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

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

Сообщение Anonymous »

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

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

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

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

    with B() as b:
    a = A(b)
    
  • Сделайте 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. В идеале я хотел бы инкапсулировать это в классе агента. Класс агента запускает и останавливает сервер. Сервер здесь реализован как менеджер контекста. Решение, которое я придумал, — сделать Агента теперь еще и менеджером контекста, что мне не нравится. Потому что тогда какой-то класс, использующий Агент, тоже должен стать менеджером контекста... и в итоге вся моя программа станет менеджером контекста.

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

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

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

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

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

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

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