Classe de décorateur Python avec des membres

Je veux écrire une classe qui aura des variables membres et des fonctions membres qui seront utilisées comme décorateurs.

class decorator_class:
def __init__(self, baseurl, username,password):
self._baseurl = baseurl
self._username = _username
self._password = _password
def decorator_get(self,arguments):
def inner_function(function):
@wraps(function)
def wrapper(*args, **kwargs):
url = self._url + argument
if len(kwargs) > 0:
url+="?"
argseperator=""
for k,v in kwargs.items():
url+="{}{}={}".format(argseperator,k,v)
argseperator="&"
r = requests.get(url, auth=(self._username, self._password))
if r.status_code!= 200:
raise Exception('Failed to GET URL: {}'.format(url))
return function(args[0],json = r.json())
return wrapper
return inner_function
class usedecorator:
def __init__(baseurl, self,user,password):
self.dec = decorator_class(baseurl, self,user,password)

@dec.decorator_get('/path/to/resource1')
def process_output_resource1(self, json):
do_something_with_json

Le problème est qu'il __init__est appelé après le chargement de la classe et qu'il decn'est pas défini à ce moment-là.

si je définis le decorator_classglobalement, cela fonctionne, mais il n'y a alors aucun moyen de passer le url, useret passwordà lui au moment de l'exécution.

Aucune suggestion?


Solution du problème

Votre decorator_get > innder_function > wrapper a le self de l'userdecorator. Phrase bizarre mais hein.

Vous avez des noms étranges, IDK pourquoi avez-vous utilisé self comme deuxième argument par exemple, mais j'ai essayé de suivre votre nom.

def decorator_get(arguments):
def inner_function(function):
@wraps(function)
def wrapper(self, *args, **kwargs):
url = self._base_url + arguments
if len(kwargs) > 0:
url+="?"
argseperator=""
for k,v in kwargs.items():
url+="{}{}={}".format(argseperator,k,v)
argseperator="&"
r = requests.get(url, auth=(self._username, self._password))
if r.status_code!= 200:
raise Exception('Failed to GET URL: {}'.format(url))
return function(self, json = r.json())
return wrapper
return inner_function
class usedecorator:
def __init__(self, baseurl,user,password):
self._base_url = baseurl
self._username = user
self._password= password

@decorator_get('/path/to/resource1')
def process_output_resource1(self, json):
do_something_with_json

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"