[Python] Список и исключение
От: _nn_ www.nemerleweb.com
Дата: 01.03.10 15:05
Оценка:
Имеется следующий код:
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 не будут добавлены элементы.

Как лучше поступить в этой ситуации ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: [Python] Список и исключение
От: drnk  
Дата: 01.03.10 15:09
Оценка:
Используйте в try-блоке tmp переменную и добавляйте в нее результат do_something.
Ну и последней строкой в try-блоке сделайте l = l_tmp ну или там l += l_tmp
Re: [Python] Список и исключение
От: neFormal Россия  
Дата: 01.03.10 19:21
Оценка:
Здравствуйте, _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)


...coding for chaos...
Re: [Python] Список и исключение
От: novitk США  
Дата: 01.03.10 19:59
Оценка:
Здравствуйте, _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)
Re[2]: [Python] Список и исключение
От: novitk США  
Дата: 01.03.10 20:07
Оценка:
Я бы делал все это более завернуто:
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)
Re: [Python] Список и исключение
От: eugals Россия  
Дата: 02.03.10 07:55
Оценка: 12 (2)
Здравствуйте, _nn_, Вы писали:

__>Код try хотелось написать как-нибудь так:

__>Но тогда в l не будут добавлены элементы.
__>Как лучше поступить в этой ситуации ?

например, так.
try:
  l = []
  l.extend(do_something(i) for i in range(100))
except Exception:
    for i in l:
        rollback(i)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.