2010-08-16 4 views
5

나는이 개념은 전에 올랐다 확신하지만 좋은, 간단한 대답을 찾을 수 없습니다. try/finally를 사용하여 여러 반환 함수를 처리하는 나쁜 방법? 예를 들어 내가 가진파이썬 시도/마지막으로 흐름 제어

 

try: 
    if x: 
     return update(1) 
    else: 
     return update(2) 
finally: 
    notifyUpdated() 
 

이것은 단지 임시 변수에 update() 명령을 저장하고이를 반환하는 것보다 좋게 보입니다. http://docs.python.org/library/contextlib.html에서

답변

11

나는 그것을 권하고 싶지 않다 사용할 수 있습니다. 첫 번째는 notifyUpdated()이 두 분기의 코드가 예외를 throw하더라도 호출됩니다. try 블록은 일반적으로 예외 처리 어떤 종류의 일을하고 나타 내기 때문에, 둘째

try: 
    if x: 
     return update(1) 
    else: 
     return update(2) 
except: 
    raise 
else: 
    notifyUpdated() 

, 당신은, 당신은 단지 그들을를 사용하지 않는 : 당신은 정말 의도 된 동작을 얻기 위해 같은 것을 필요 편의. 그래서이 구성은 사람들을 혼란스럽게 할 것입니다.

예를 들어, 질문에 대답하기위한 처음 두 사람 (적어도 한 명은 답변을 삭제 한 사람) 중 어느 누구도 귀하가 실제로 시도한 것을 깨닫지 못했습니다. 혼란스러운 코드는 아무리 편리하고 똑똑한 것처럼 보이더라도 좋지 않습니다.

+0

좋은 점은 처음 두 답변이 표시를 놓친 것이 너무 혼란 스럽다는 것입니다. –

0

:


from contextlib import closing 
import urllib 

with closing(urllib.urlopen('http://www.python.org')) as page: 
    for line in page: 
     print line 

은 그래서 당신은 유사한 기능을 작성하고

+0

좋은 아이디어라고 생각합니다. – Omnifarious

+0

'with' stmt는 닫기에서 정리를 보장하는 합법적 인 방법입니다. – amwinter

3

나는 당신이 마지막으로이 대안으로 시도/사용하고자하는 의미 생각 :

if x: 
    result = update(1) 
else: 
    result = update(2) 
notifyUpdated() 
return result 

나는이 스타일의 문제입니다 같아요. 나는 예외적 인 조건부를 처리하기 위해 try을 예약하고 싶다. 나는 그것을 흐름 제어 문으로 사용하지 않을 것이다.

+0

그것이 스타일의 문제라고 생각하지만, 그 질문에는 예 또는 대답이 없음을 의미하지 않는다고 생각하지 않습니다. 나는 분명히 당신이 진술 한 이유 때문에 그리고 더 혼란 스럽기 때문에 '아니오'라고 말할 것입니다. – Omnifarious

+0

동의합니다. 나는 더 강한 태도를 취해야한다. –

11

나는 예외를 포함하지 않는 흐름에 try/finally를 사용하지 않을 것이다. 그것은 자신의 이익을 위해 너무 까다 롭습니다.

이 더 낫다 :

if x: 
    ret = update(1) 
else: 
    ret = update(2) 
notifyUpdated() 
return ret 
3

나는이 문제에 대한 요구하고있다 생각합니다. 나중에 코드를 다음과 같이 변경하면 나중에 어떻게됩니까?

try: 
    if x: 
     return update(1) 
    elif y: 
     return update(2) 
    else: 
     return noUpdateHere() 
finally: 
    notifyUpdated() # even if noUpdateHere()! 

는 기껏해야, 그것은 (아마 심지어 6 개월), 그것 때문에 일반적인 사용 패턴과 다른 목적을 위해 try/finally을 사용하고 코드의 대부분의 독자를위한 장애물 점입니다. 그리고 그것이 저장하는 타이핑은 어쨌든 최소한입니다.

+0

나는 그 걸림돌을 놓쳤다. 이 경우는 원래의 숨겨진 형식으로 이미 존재합니다. 왜냐하면'update (1)'또는'update (2)'가'notifyUpdated()'를 호출하지 않아야한다는 예외를 던지기 때문입니다. – Omnifarious

3

는 내가 장식 정말 작전의 문제를 해결하지 않습니다 여기

def notifyupdateddecorator(f): 
    def inner(*args, **kw): 
     retval = f(*args, **kw) 
     notifyUpdated() 
     return retval 
    return inner 

@notifyupdateddecorator 
def f(x): 
    if x: 
     return update(1) 
    else: 
     return update(2) 

@notifyupdateddecorator 
def g(x): 
    return update(1 if x else 2) 
+0

흠, 맞춤 장식에 대해 본 적이 없습니다. 이것이 어디에 기술되어 있는지에 대한 링크가 있습니까? – Falmarri

+0

@Falmarri, http://docs.python.org/glossary.html#term-decorator –

관련 문제