dinamically altering a function

vegetax vegeta.z at gmail.com
Sat Mar 12 23:19:36 CET 2005


Steven Bethard wrote:

> vegetax wrote:
>> I i need a decorator that adds a local variable in the function it
>> decorates, probably related with nested scopes, for example:
>> 
>> def dec(func):
>>     def wrapper(obj = None):
>>         if not obj : obj = Obj()
>>   <bind obj to func>
>>  return func()
>> 
>>     return wrapper()
>> 
>> @dec()
>> def fun(b):
>>     obj.desc = 'marked'
>>     obj.b = b
>>     return obj
>> 
>> so the call to fun : fun(obj = myobj,'b argument')
>> or fun('b argument')
>> 
>> So the function "fun" assumes it has an obj instance and other instance
>> objects computed by the decorator, this decorator will be like a generic
>> factory for this kind of functions,which depends on the decorator to
>> work.
> 
> For a byte-code hack that does something similar, see the recent thread:
> 
> http://mail.python.org/pipermail/python-list/2005-March/270324.html
> 
> It can do something like:
> 
> py> class Object(object):
> ...     pass
> ...
> py> @presets.presets(obj=Object())
> ... def fun(b):
> ...     obj.desc = "marked"
> ...     obj.b = b
> ...     return obj
> ...
> py> fun(1)
> <__main__.Object object at 0x01162BD0>
> py> fun(1).b
> 1
> 
> But note that you then only have a single instance for all calls to the
> function:
> 
> py> fun(1) is fun(2)
> True

Interesting hack, but the functions must not share the same object.Maybe i
could make my version of that decorator,i will check it.

> Have you considered using OO here?  You might find that this is more
> easily written as:
> 
> py> class Object(object):
> ...     pass
> ...
> py> class fun(object):
> ...     def __new__(self, *args):
> ...         if len(args) == 2:
> ...             obj, b = args
> ...         elif len(args) == 1:
> ...             obj, [b] = Object(), args
> ...         else:
> ...             raise TypeError
> ...         obj.desc = "marked"
> ...         obj.b = b
> ...         return obj
> ...
> py> myobj = Object()
> py> fun(myobj, 2)
> <__main__.Object object at 0x01162E30>
> py> myobj.b
> 2
> py> obj = fun(1)
> py> obj.b
> 1
> 
> This doesn't use any bytecode hacks, but I'm still not certain it's
> really the way to go.  What is it you're trying to write this way?

OO doesnt work here,i have factored to classes with inheritance but it looks
clumsy and it is clumsy to use, this things are in nature,functions.

What i want is to declare in the decorator some code that is common to all
these functions, so the functions assume that the decorator will be there
and wont need to duplicate the code provided by it, and the functions are
not known ahead of time, it has to be dynamic.







More information about the Python-list mailing list