Estoy tratando de pasar argumentos opcionales a mi decorador de clases en python. A continuación el código que tengo actualmente:Argumentos del decorador de clases de Python
class Cache(object):
def __init__(self, function, max_hits=10, timeout=5):
self.function = function
self.max_hits = max_hits
self.timeout = timeout
self.cache = {}
def __call__(self, *args):
# Here the code returning the correct thing.
@Cache
def double(x):
return x * 2
@Cache(max_hits=100, timeout=50)
def double(x):
return x * 2
El segundo decoradora con argumentos para sobrescribir el valor predeterminado (max_hits=10, timeout=5
en mi función __init__
), no está funcionando y me dieron la excepción TypeError: __init__() takes at least 2 arguments (3 given)
. Intenté muchas soluciones y leí artículos al respecto, pero aquí todavía no puedo hacer que funcione.
¿Alguna idea para resolver esto? ¡Gracias!
¡Gracias chicos y @lunixbochs por su solución! Funciona como un encanto :) – Dachmt
Si el desarrollador llama 'Cache' con argumentos posicionales en lugar de palabras clave (por ejemplo '@Cache (100,50)') entonces 'function' se le asignará el valor 100, y' max_hits' 50. An el error no se levantará hasta que se llame a la función. Esto podría considerarse un comportamiento sorprendente, ya que la mayoría de la gente espera una semántica posicional y de palabras clave uniforme. – unutbu