2013-11-25 2 views
0

나는 다음과 같은 파이썬 기능이 있습니다이 "if"문 안의 코드가 아직 실행되는 이유는 무엇입니까?

api_function: 
    try: 
     # api query 
    except: 
     # api error #1 
     return "api error 1" 
    except: 
     # api error #2 
     return "api error 2" 
    else: 
     return api_data_dict 

나는이 기능을 실행하려면, 그리고 오류가 존재하지 않는 경우는, 데이터가 API에서 반환 해석 : 나는이 코드를 실행하면

for call in api_call_list: 
    raw_api_data = api_function(access_token) 
     if raw_api_data != 'api error 1' or 'api error 2': 
      page_name = raw_api_data['name'] 
      # process api data 

을, API가 작동하는 한 정상적으로 실행됩니다. API가 오류를 칠 때 그러나 if 문은 문자열을 잡으려고하지 않는 것 - 대신에, 나는 역 추적 얻을 :

Traceback (most recent call last): 
    File "api_retriever.py", line 4, in <module> 
    page_name = raw_api_data['name'] 
TypeError: string indices must be integers, not str 

왜 오류 문자열을 잡기 내 if 문에 의해 반환되지 않습니다 내 api_function 및 줄 4가 고르지 못하도록합니까?

+0

예외를 잡기 및 오류 코드를 반환 - 호출 측에 확인해야 - 대신 발신자 캐치 예외를 댄다는 오히려 이상한 패턴이다. 아니면 반 패턴이라고해야합니까? –

+0

어떻게 구조화해야할지 모르겠다. API 호출이 성공적으로 반환 된 경우에만 API 데이터를 구문 분석하고 싶습니다. 그 함수를 여러 번 사용하기 때문에 api 데이터를 처리하는 로직을 API 호출 함수 내부에 넣을 수는 없으며 데이터를 약간 다르게 처리하려고 할 때마다 사용할 수 있습니다. –

+0

예외를 전파하여 상위 레벨에서 잡으십시오 (결국 예외 유형이 너무 많아지면 간단히 처리 할 수 ​​있습니다). 또는이를 잡아서 'api_function' 레벨에서 로그 한 다음'None' 만 리턴하십시오. 예외가있는 전체 요점은 오류 코드를 피하는 것입니다 ... –

답변

4

코드의이 줄 :

if raw_api_data != 'api error 1' or 'api error 2': 

실제로 항상 True로 평가하는 것이 아닌 빈 문자열

if (raw_api_data != 'api error 1') or ('api error 2'): 

으로 파이썬으로 해석됩니다.

당신이 사용한다

if (raw_api_data != 'api error 1') and (raw_api_data != 'api error 2'): 

또는

if not raw_api_data in ('api error 1', 'api error 2'): 
+0

"귀하는 다음을 사용하십시오 :"아래의 코드는 항상 if를 입력합니다. ;) – Mailerdaimon

+0

@Mailerdaimon 지적 해 주셔서 대단히 감사합니다. 나는 그것을 고쳤다>< – starrify

2

Or는 논리 OR 연산자라고합니다. 두 피연산자 중 하나가 0이 아니면 조건이 참이됩니다. 이 대신에 (source)

사용 :

if (raw_api_data != 'api error 1') and (raw_api_data != 'api error 2'): 
관련 문제