为什么这个“if”语句中的代码仍然运行?

时间:2013-11-25 08:13:25

标签: python if-statement equality

我有以下python函数:

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行运行?

2 个答案:

答案 0 :(得分:4)

这段代码:

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

实际上被解释为

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

在Python中,非空字符串总是会计算为True。

你应该使用:

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'):

答案 1 :(得分:2)

Or被称为逻辑OR运算符。如果两个操作数中的任何一个非零,则条件变为真。 (source

请改用:

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