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 dec
n'est pas défini à ce moment-là.
si je définis le decorator_class
globalement, cela fonctionne, mais il n'y a alors aucun moyen de passer le url
, user
et 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
Enregistrer un commentaire