Это не тот способ, которым вы предполагаете использовать контекстный менеджер. Первые принципы ОО рекомендуют иметь правильную инкапсуляцию, что означает, что пользователю не нужно знать подробности реализации.
Я бы предложил следующий дизайн:
- менеджер контекста принимает list в качестве параметра создания
- предоставляет 2 метода:
append(val)
, которые подготавливают , добавляя val в список и возвращая себя, чтобы разрешить сцепление appending()
, который возвращает список элементов для добавления
- подготовленные элементы добавляются только в том случае, если исключение не возникло
Возможная реализация:
class contextmanager():
def __init__(self, var):
self.orig = var
self.cur = []
def append(self, val):
self.cur.append(val)
return self
def appending(self):
return self.cur
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
if exc_type is None:
self.orig.extend(self.cur)
Пример использования:
a = [1,2,3]
print("initial", a)
with contextmanager(a) as t:
t.append(4)
print("appending", t.appending())
t.append(5).append(6)
print("appending", t.appending())
print("first pass", a)
try:
with contextmanager(a) as t:
t.append(7)
t.append(8)
print("appending", t.appending())
raise Exception()
t.append(9)
print("appending", t.appending())
except Exception as e:
print("Exception", e)
print("final", a)
, что дает:
initial [1, 2, 3]
appending [4]
appending [4, 5, 6]
first pass [1, 2, 3, 4, 5, 6]
appending [7, 8]
Exception
final [1, 2, 3, 4, 5, 6]