Me gustaría hacer un decorador que podría ser utilizado con o sin un parámetro: Algo como esto:¿Cómo construir un decorador con parámetros opcionales?
class d(object):
def __init__(self,msg='my default message'):
self.msg = msg
def __call__(self,fn):
def newfn():
print self.msg
return fn()
return newfn
@d('This is working')
def hello():
print 'hello world !'
@d
def too_bad():
print 'does not work'
En mi código, sólo el uso de decorador con el parámetro está trabajando: ¿Cómo proceder para tener ambos trabajando (con y sin parámetro)?
Supongo que funciona para su caso y lo haría en casos similares. Pero, ¿y si el argumento del decorador es en realidad una sola invocación? ¿Cómo diferenciaría usted entre la función decorada y el argumento? – ksrini
@ksrini: Ignacio lo señaló en su [respuesta] (http://stackoverflow.com/a/3931654/355230) años atrás. – martineau
También puede evitar esto usando argumentos de palabras clave (como '@trace (default = ...)'). – jtbandes