Forgot to mention, decorator() and weak_signature_decorator() expect a
closure. In your case
def mensagem_json():
def entangle(func):
def caller(func, *args, **kwords):
print "#################"
return caller
return weak_signature_decorator(entangle)
....
@mensagem_json()
def ...
should do the trick.
As of 1285 two new decorator factories are available:
simple_decorator()
simple_simple_weak_signature_decorator()
which work as before (apply to caller, no Py2.3 compatibility).
I would however very much appreciate if you could also try to make the
new weak_signature_decorator() work with your code, just to make sure
before I apply these changes to a5. Thanks!
Cheers,
Simon
Jorge Godoy wrote:
> Em Quinta 27 Abril 2006 19:42, Simon Belak escreveu:
>> Hi,
>>
>> I'm going to make everyone's life miserable again. ;)
>>
>> In r1279 I added support for "alternative" decorator syntax as used by
>> PEAK to lessen the anguish of people still on Python 2.3. This
>> unfortunately requires a bit different application of decorator() function.
>>
>> Before:
>>
>> def foo(a):
>> def entagle(func)
>> def caller(func, *args, **kw):
>> func(*args, **kw)
>> return decorator(caller)(func)
>> return entagle
>>
>> after:
>>
>> def foo(a):
>> def entagle(func)
>> def caller(func, *args, **kw):
>> func(*args, **kw)
>> return caller
>> return decorator(entagle)
>>
>> As an added bonus it is also marginally more concise.
>
> I had, before:
>
> @decorator
> def my_decorator(func, *args, **kwords):
> ...
>
> How should I translate it to the new syntax? I'm not worried with supporting
> Python 2.3 here, so the easiness of the old syntax was very nice to me.
>
>> While I was at it, I made another change. Until now decorator() added
>> *args and **kw to the resulting function signature unless optional
>> argument "argsink" was false.
>> Well, "argsink" is no more. Instead we have a much more powerful (still
>> optional) argument "signature" similar in composition to what
>> inspect.getargspec() returns, allowing us to define an arbitrary
>> signatures (mind, the function being decorated still needs to be able to
>> digest this new parameter specification).
>> To get the beloved care-free will-eat-anything signatures back a helper
>> named weak_signature_decorator() is available.
>
> I tried it as well, but it won't work with the above (mine) syntax. I had to
> convert to your syntax to have it working... But then, I started having
> other problems, specially with @turbogears.validate, which is failing always.
>
>> I invite all interested to take a look at decorator.py and
>> test_decorator.py. The use of signature in anger can be observed in
>> util.bind_args().
>>
>> Knowing myself I suggest we keep it in trunk for a while (maybe until
>> after the sprint and than send it into the wild with nice and shiny
>> documentation by it's side).
>
> Here are my "attempts":
>
> ===============================================================================
> def mensagem_json():
> def entangle(func):
> def caller(func, *args, **kwords):
> print "#################"
> return caller
> return decorator(entangle)
> ===============================================================================
>
> What results in:
>
> ===============================================================================
> Traceback (most recent call last):
> File "./start-siteamostras.py", line 26, in ?
> from siteamostras.controllers import Root
> File
> "/home/godoy/empresa/clientes/latam/Site-Amostras/siteamostras/controllers/__init__.py",
>
> line 18, in ?
> from siteamostras.controllers.toxicologia import Toxicologia
> File
> "/home/godoy/empresa/clientes/latam/Site-Amostras/siteamostras/controllers/toxicologia.py",
>
> line 24, in ?
> from siteamostras.controllers import analises
> File
> "/home/godoy/empresa/clientes/latam/Site-Amostras/siteamostras/controllers/analises.py",
>
> line 29, in ?
> class Analises(controllers.Controller):
> File
> "/home/godoy/empresa/clientes/latam/Site-Amostras/siteamostras/controllers/analises.py",
>
> line 213, in Analises
> @turbogears.expose()
> TypeError: mensagem_json() takes no arguments (1 given)
> ===============================================================================
>
> When I change it to:
>
> ===============================================================================
> def mensagem_json(something):
> def entangle(func):
> def caller(func, *args, **kwords):
> print "#################"
> return caller
> return decorator(entangle)
> ===============================================================================
>
> it runs, but @turbogears.validate fails.
>
> Changing it to:
>
> ===============================================================================
> def mensagem_json(func):
> def entangle(func):
> def caller(func, *args, **kwords):
> print "#################"
> return caller
> return decorator(entangle)
> ===============================================================================
>
> Using weak_signature_decorator doesn't help and yields the same results.
>
>
> In my code I have:
>
> ===============================================================================
> @turbogears.expose()
> @turbogears.error_handler(turbogears.util.bind_args(add = True)(analises))
> @turbogears.validate(form = formulario_analises)
> @identity.require(identity.conditions.in_group("latam_novo"))
> @mensagem_json
> def save(self, **kword):
> ...
> ===============================================================================
>
> I hope I'm doing something wrong and that is easy to solve.
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"TurboGears Trunk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/turbogears-trunk
-~----------~----~----~----~------~----~------~--~---