2013-12-17 1 views
2

Я хочу, чтобы иметь возможность вернуть успех, когда вызов метода преуспевает, но все же сможет вернуть код ошибки http, когда он терпит неудачу.Как вернуть логическое значение для успеха и по-прежнему включать код статуса http в python?

Очевидно, что единственное числовое значение, которое оценивается как False, равно 0, поэтому возвращение http-кодов как числовых значений будет оценивать все из них как истинные.

У меня создалось впечатление, что решение заключается в возврате объекта, который оценивается как истинный только для значений 200-2xx, и который также преобразуется в число, чтобы люди могли его сравнить.

Вы знаете кого-нибудь, у кого был подобный подход? - Мне не нравится идея делать исключения в этом случае.

ответ

3

Просто вернуть два результата, флаг успеха и ответ HTTP:

def some_function(): 
    return success, http_response 

и использовать присваивание кортеж:

success, response = some_function() 
if success: 

подход, что requests module занимает вернуть объект ответа всегда, то вы можете выбрать повышение исключения на основе кода ответа:

response = requests.get(url) 
response.raise_for_status() 

, где Response.raise_for_status() method предоставляет пользователям вашего API опцию , чтобы возбудить исключение. Другой вариант для проверки кода статуса:

if not 200 <= response.status_code <= 299: 
    # problem status response 

Оба эти подхода имеют то преимущество, что они явное. Не пытайтесь перегрузить возвращаемое значение с несколькими значениями. Если ответ HTTP вне диапазона 2xx является исключением, рассматривайте его как таковое, создавая исключение.

+0

Я думал об этом подходе, но, насколько мне известно, он не будет работать, потому что кортеж типа '(False, 401)' будет выглядеть как «True». – sorin

+0

Вот почему вам нужно распаковать возвращенный кортеж, см. Второй фрагмент кода. Я не тестирую 'if some_function()', я тестирую 'success', что является значением * first * в возвращаемом кортеже. –

+0

Если распаковка - это не то, что вы хотите сделать, вам нужен объект класса, который имеет репрезентацию вашего логического элемента и атрибут, содержащий ваш код состояния. –

0

Я не уверен, что вы имеете в виду, но я предполагаю, что вы просто хотите поймать ошибки Http. В этом случае, это вы имеете в виду? (Я обычно использую сборку в модуле «urllib2» делать запросы HTTP/открытые URLs)

import urllib2 
try: 
    urllib2.urlopen(url) #open a url 
except urllib2.HTTPError, err: 
    if err.code == 404: 
      print "Page not found!" 
    elif err.code == 403: 
     print "Access denied!" 
    else: 
     print "Something happened! Error code", err.code 
except urllib2.URLError, err: 
    validationerror = err 
    print(" ") 
    print("Connection error") 
    print(err) 
    print "Can not connect to annotation review server" 
    print(" ") 
except: 
    validationerror = (sys.exc_info()[0]) 
    print(validationerror) 
2

Это не Pythonic полагаться на возвращаемые значения, чтобы указать успех/провал, особенно в функции, которая, как предполагается, чтобы вернуться что-то в первую очередь.

Просто верните код HTTP. Если функция не удалась, создайте исключение (создайте собственное исключение - TimeoutError, UnknownHostError ... и сделайте код HTTP одним из его атрибутов).

Кроме того, взгляните на то, что делает библиотека запросов (http://requests.readthedocs.org). Объекты ответа имеют метод raise_for_status, который вызывает исключение, если их код HTTP не находится в диапазоне 2xx.

Смежные вопросы