arnodel at googlemail.com
Fri Feb 12 08:29:12 CET 2010
"Gabriel Genellina" <gagsl-py2 at yahoo.com.ar> writes:
> En Thu, 11 Feb 2010 00:25:00 -0300, Terry Reedy <tjreedy at udel.edu>
>> On 2/10/2010 4:49 PM, Gabriel Genellina wrote:
>>> I've written a decorator for "injecting" a __function__ name into the
>>> function namespace, but I can't find it anywhere. I think I implemented
>>> it by adding a fake additional argument and replacing LOAD_GLOBAL with
>>> LOAD_NAME in the bytecode.
>> The decorator only needs to replace the defaults args tuple.
>> It does not even need to know the parameter name,
>> just that it is the only (or last) with a default .
>> def f(n, me=None):
>> if n > 0: return n*me(n-1)
>> elif n==0: return 1
>> f.__defaults__ = (f,) # 3.1
> This is simple to implement, but requires changing the function
> definition. My goal was to keep the original code unchanged, that is,
> leave it as:
> def f(n):
> if n > 0: return n*f(n-1)
> elif n==0: return 1
> (like a normal, recursive function), and make the 'f' inside the function
> body "magically" refer to the function itself.
I posted an example of a decorator that does just this in this thread a
couple of days ago:
It doesn't require any bytecode hacking, although it requires breaking
apart the function object and making a new one from the bits.
More information about the Python-list