Quiero escribir una clase que tenga variables miembro y funciones miembro que se usarán como decoradores.
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
El problema es que __init__
se llama después de cargar la clase y en ese momento dec
no está definida.
si defino decorator_class
globalmente, funciona, pero entonces no hay forma de pasar el url
, user
y password
en tiempo de ejecución.
¿Alguna sugerencia?
Solución del problema
Su decorator_get > innder_function > wrapper tiene el propio usuario decorador. Extraña frase pero eh.
Tiene algunos nombres extraños, IDK, ¿por qué usó self como segundo argumento, por ejemplo, pero traté de seguir su nombre?
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
No hay comentarios:
Publicar un comentario