2010-02-26 3 views
4

python2.4에서 멈추었으므로 finally 절을 생성자 또는 yield과 함께 사용할 수 없습니다. 이 문제를 해결할 수있는 방법이 있습니까?finally 절이있는 try 블록에서 파이썬 2.4의 yield가 허용되지 않습니다.

파이썬 2.4에서이 제한을 해결하는 방법에 대한 언급을 찾을 수 없으며 (주로 __del__을 포함하여 해결 방법에 대한 큰 팬이 아니며 합리적인 시간)은별로 매력적이지 않습니다.

답변

6

당신은 finally 블록 피하기 위해 코드를 복제 할 수 있습니다 :

try: 
    yield 42 
finally: 
    do_something() 

가되다 :

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

(파이썬 2.4에서이 시도하지했습니다를, 당신은 sys.exc_info보고 할 수 있습니다 raise sys.exc_info[0], sys.exc_info[1], sys.exc_info[2]과 같이 위의 re-raise 문 대신.

2

생성자 인스턴스가 단순히 폐기 될 때 보장되는 유일한 코드입니다 (garbage co llected)는 해당 로컬 변수에 대한 __del__ 메소드 (외부에 해당 객체에 대한 참조가없는 경우) 및 해당 로컬 변수에 대한 약한 참조에 대한 콜백입니다. 약한 참조 경로는 비 침습적이므로 (__del__이라는 특수 클래스는 필요하지 않습니다. 약한 참조 가능). 예 :

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 

원하는 경우 finis!을 인쇄합니다.

관련 문제