Solução alternativa para o rendimento do python 2.4 não permitido no bloco try com cláusula finalmente

StackOverflow https://stackoverflow.com/questions/2339358

Pergunta

Estou preso no python2.4, então não posso usar uma cláusula final com geradores ou yield.Existe alguma maneira de contornar isso?

Não consigo encontrar nenhuma menção sobre como contornar essa limitação no python 2.4 e não sou um grande fã das soluções alternativas que pensei (principalmente envolvendo __del__ e tentar garantir que ele seja executado dentro de um prazo razoável) não são muito atraentes.

Foi útil?

Solução

Você pode duplicar o código para evitar o bloco finalmente:

try:
  yield 42
finally:
  do_something()

Torna-se:

try:
  yield 42
except:  # bare except, catches *anything*
  do_something()
  raise  # re-raise same exception
do_something()

(Eu não tentei isso no Python 2.4, você pode ter que olhar para sys.exc_info em vez do re-raise declaração acima, como em raise sys.exc_info[0], sys.exc_info[1], sys.exc_info[2].)

Outras dicas

O único código que pode ser chamado quando uma instância do gerador é simplesmente abandonada (lixo coletado) é o __del__ métodos para suas variáveis ​​locais (se não existirem referências a esses objetos fora) e os retornos de chamada para referências fracas a suas variáveis ​​locais (idem).Eu recomendo a via de referência fraca porque não é invasiva (você não precisa de uma aula especial com um __del__ - apenas qualquer coisa que seja fracamente referenciável).Por exemplo.:

import weakref

def gen():
  x = set()
  def finis(*_):
    print 'finis!'
  y = weakref.ref(x, finis)
  for i in range(99):
    yield i

for i in gen():
  if i>5: break

isso imprime finis!, como desejado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top