Python Decorator – So verwenden Sie Funktionsrückgabewerte innerhalb der Decorator-FunktionPython

Python-Programme
Anonymous
 Python Decorator – So verwenden Sie Funktionsrückgabewerte innerhalb der Decorator-Funktion

Post by Anonymous »

Ich weiß nicht, wie ich das lösen soll. Ich teste das Senden von GET-Anfragen mit dem Python-Requests-Modul. Die Idee ist, dass ich die Anfrage erneut versuchen sollte, wenn ich einen Response.status_code von mehr als 500 zurückbekomme.
Bisher habe ich die Lösung implementiert die Anfrage unabhängig vom Statuscode erneut zu versuchen, und es funktioniert einwandfrei. Ich habe jedoch Schwierigkeiten, den Statuscode des ersten Aufrufs in der Funktion main() an die Dekoratorfunktion retry_requests zu übergeben.
Wenn beispielsweise der Statuscode 404 war, möchte ich, dass der Dekorator retry_requests dies bestätigt und den Dekorator überhaupt NICHT AUSFÜHRT. Wenn der Statuscode 5xx war, möchte ich, dass der retry_requests-Dekorator bestätigt, dass die retry_requests ausgeführt werden.
Bei mir funktioniert Folgendes Code unten.

Code: Select all

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()

Ich möchte den Statuscode an den Dekorator übergeben, damit ich ihn in der While-Schleife referenzieren kann. Es wäre also: `

Code: Select all

while (attempts < retries) and (status_code > 5):
Ich habe eine Problemumgehung, bei der ich eine ENV- oder globale Variable mit dem Statuscode festlegen oder die Wiederholungslogik für Anfragen verwenden könnte. Ich habe mich jedoch gefragt, ob es tatsächlich möglich ist, meine ursprüngliche Idee innerhalb der Dekoratorfunktion selbst umzusetzen. Ich schätze, das liegt eher daran, dass ich herausgefunden habe, wie ich es falsch implementiert habe.
Ich habe versucht, den Statuscode hier als Argument zu übergeben:

Code: Select all

def retry_requests(func, retries=3):
def retry_wrapper(status_code, *args, **kwargs):
attempts = 0
while (attempts < retries) and (status_code > 500):
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(status_code)
def get_request():
response = requests.get("https://restful-booker.herokuapp.com/mamsma")
status_code = response.status_code
return status_code
was den Namensfehler zurückgibt. NameError: Name 'status_code' ist nicht definiert
Wenn ich ihn innerhalb der Funktion definiere, erhalte ich TypeError : retry_requests() fehlt 1 erforderliches Positionsargument: 'status_code'
Ich möchte die Funktion nicht erneut ausführen, bevor ich sie zurückgebe. Ich möchte nur auf die zurückgegebenen Ausgaben des ersten Aufrufs im Dekorator zugreifen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post