GOOGLE ADS

jueves, 14 de abril de 2022

Clase de decorador de Python con miembros

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 decno está definida.

si defino decorator_classglobalmente, funciona, pero entonces no hay forma de pasar el url, usery passworden 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

Regla de Firestore para acceder a la generación de subcolección Permisos faltantes o insuficientes

Tengo problemas con las reglas de Firestore para permitir el acceso a algunos recursos en una subcolección. Tengo algunos requests document...