Как использовать возвращаемые значения функции в функции декоратораPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как использовать возвращаемые значения функции в функции декоратора

Сообщение Anonymous »

Я не знаю, как это решить. Я тестирую отправку запросов GET с помощью модуля запросов Python. Идея состоит в том, что если я получу ответ.status_code больше 500, мне придется повторить запрос.
На данный момент я реализовал решение повторить запрос независимо от кода состояния, и оно работает отлично. Однако я изо всех сил пытаюсь передать status_code первоначального вызова функции main() в функцию-декоратор retry_requests.
Например, если status_code был 404, я хочу, чтобы декоратор retry_requests подтвердил это и НЕ ЗАПУСКАЛ декоратор вообще. Если status_code был 5xx, я хочу, чтобы декоратор retry_requests подтвердил запуск retry_requests.
У меня работает следующее код ниже.

Код: Выделить всё

import requests, time

def retry_requests(func, retries=3):
def retry_wrapper(*args, **kwargs):
attempts = 0
while attempts < retries:
try:
return func(*args, **kwargs)
except requests.exceptions.RequestException as e:
print(f"Error as {e}.")
attempts +=1
time.sleep(3)
return retry_wrapper

@retry_requests
def get_request():
response = requests.get("https://this-url-does-not-exist-sorry-jwsgudkaad")
status_code = response.status_code
return status_code

def main():
status_code = get_request()

if __name__ == '__main__':
main()
Я хочу передать код status_code в декоратор, чтобы можно было ссылаться на него в цикле while. Итак, это будет: `

Код: Выделить всё

while (attempts < retries) and (status_code > 5):
У меня есть обходной путь, с помощью которого я могу установить ENV или глобальную переменную с кодом состояния или использовать логику повтора запросов. Однако мне было интересно, можно ли реализовать мою первоначальную идею в самой функции декоратора. Думаю, это больше для того, чтобы я понял, как я это неправильно реализовал.
Когда я определяю это внутри функции, я получаю TypeError: retry_requests() отсутствует 1 обязательный позиционный аргумент: 'status_code'
Я не хочу снова запускать функцию до ее возврата. Я просто хочу получить доступ к возвращаемым результатам первоначального вызова в декораторе.

Подробнее здесь: https://stackoverflow.com/questions/793 ... r-function
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»