Здравствуйте, _nn_, Вы писали:
__>Код try хотелось написать как-нибудь так:
__>Но тогда в l не будут добавлены элементы.
__>Как лучше поступить в этой ситуации ?
например, так.
try:
l = []
l.extend(do_something(i) for i in range(100))
except Exception:
for i in l:
rollback(i)
Имеется следующий код:
def do_something(i):
if i == 10:
raise Exception()
return i
def rollback(i):
print i
try:
l = []
for i in range(100):
l.append(do_something(i))
except Exception:
# Пройтись по добавленным элементам и отменить
for i in l:
rollback(i)
Код try хотелось написать как-нибудь так:
try:
l = map(do_something, range(100))
except Exception:
# Пройтись по добавленным элементам и отменить
for i in l:
rollback(i)
Но тогда в l не будут добавлены элементы.
Как лучше поступить в этой ситуации ?
Используйте в try-блоке tmp переменную и добавляйте в нее результат do_something.
Ну и последней строкой в try-блоке сделайте l = l_tmp ну или там l += l_tmp
Здравствуйте, _nn_, Вы писали:
__>Но тогда в l не будут добавлены элементы.
__>Как лучше поступить в этой ситуации ?
например, можно пожертвовать наглядностью
l = []
def do_something(i):
if i == 10:
raise Exception()
l.append(i)
return i
def rollback(i):
print i
try:
map(do_something, range(100))
except Exception:
# Пройтись по добавленным элементам и отменить
for i in l:
rollback(i)
Здравствуйте, _nn_, Вы писали:
с одной переменной сделать не получиться, так как тип результата map-a и аргументов для rollback-a вообще говоря разный. Можно соорудить нечто такое:
def mapTillException(func, source, processed):
result = []
try:
for e in source:
result.append(func(e))
processed.append(e)
except Exception:
raise
return result
...
def main():
try:
processed = []
result = mapTillException(do_something, range(100), processed)
except Exception:
for i in processed:
rollback(i)
Я бы делал все это более завернуто:
def mapWithRollback(func, source, rollback):
result = []
processed = []
try:
for e in source:
result.append(func(e))
processed.append(e)
except Exception:
for i in processed:
rollback(i)
raise
return result
...
def main():
result = mapWithRollback(do_something, range(100), rollback)