2014-05-16 12 views
1

가장 멋진 파이썬 방식으로 달성하고 싶은 내용은 다음과 같습니다. 특정 필터에서 데이터베이스의 객체를 찾으십시오. 결과가없는 경우에만 다른 필터를 사용하여 개체를 찾으십시오. 결과가 반환되지 않으면 객체가 존재하지 않으므로 새 인스턴스를 삽입하십시오.제어 흐름을 위해 Python 중첩 시도/예외/다른 방법

내가 생각하고 무엇 :이 블록이 정확하거나 가장 좋은 방법은 내가 달성하기 위해 노력하고있어 처리 할 경우

try: 
    obj = session.query(model).filter_by(field_a).one() 
except NoObjFound: 
    try: 
     obj = session.query(model).filter_by(field_b).one() 
    except NoObjFound: 
     insert_into_db(brand_new_obj) 
else: 
    update_the_obj(obj) 

잘 모르겠어요.

+3

현재 가지고있는 것의 단점은 'else'가 첫 번째 'try'에만 적용된다는 것입니다. 내부의'try'는 결코 그 라인에 도달하지 않을 것입니다. – jonrsharpe

+0

else 절을 ​​다시 들여서 두 필터에 결과가없는 경우에만 업데이트하도록해야합니다. 하지만 자주 사용하기 때문에 이것이 파이썬이라고 생각합니다. – Llopis

+0

'else/else'절을 내부 try/except 블록에 들여 쓰기하면 외부 'try/except' 블록에서 숨길 것입니다. 이것은 저자가 원하는 것이 아닙니다. – huu

답변

6

나는이 같은 제안이 올바른 일을 올바른 순서로 일어날 수 있도록한다

for filter in (field_a, field_b): 
    try: 
     obj = session.query(model).filter_by(filter).one() 
    except NoObjFound: 
     pass # or 'continue' 
    else: 
     update_the_obj(obj) 
     break 
else: 
    insert_into_db(brand_new_obj) 

는 수 try 블록을 중첩하고보다 더 많은 읽을 수 쉽게 추가 filter을 추가 확장 할 수 있습니다.

+0

나를 두들겨라. 나는 내 대답에 따라'계속'이'패스'보다 더 의미가 있다고 생각한다; 당신이 대답에 동의하고 편집한다면, 나는 광산을 사기꾼으로 삭제할 것입니다 (그렇지 않으면 테이블에 두 가지 대안을 둘 수도 있습니다). –

+1

@ZeroPiraeus'continue'와'pass'는'for' 블록 내에 추가적인 내용이 없기 때문에 여기에서 정확히 같습니다. 'continue'는 나머지 블록에서 일어나는 일들을 건너 뛰고 싶을 때 유용하지만 여기서는 적용되지 않습니다. – jonrsharpe

+0

흐름 제어에 대한 효과면에서 그렇습니다.하지만 "계속해서 객체를 찾는"의도이기 때문에, "계속"은 나에게 더 표현력이 있습니다. 개인적인 취향, 나는 생각한다. 어쨌든, 삭제 된 광산과 upvoted 너의 :-) –

0

올바르지 않습니다. 어떤 필터에서 발견 된 것과 독립적 인 객체를 찾은 후에 update_the_obj(obj)을 원한다고 가정하면 끝에있는 else 절이 내부 필터에 숨겨집니다.

당신은 시도 할 수 있습니다 :

obj = None 
try: 
    obj = session.query(model).filter_by(field_a).one() 
except NoObjFound: 
    try: 
     obj = session.query(model).filter_by(field_b).one() 
    except NoObjFound: 
     insert_into_db(brand_new_obj) 

if obj is not None: 
    update_the_obj(obj) 
+0

'try '안에'obj'가 지정되어 있지 않으면'obj :'에'NameError'가 생깁니다. – jonrsharpe

+0

좋은 캐치! 편집 내 대답 – huu

+0

신원 확인 (''obj가 None'이 아닌)과 같은 싱글 톤을 확인해야합니다 -'False' 또는'0'이거나 빈 컨테이너가 유효한 값일 수 있지만, 단순한'if obj' 조건 – jonrsharpe