Hi Chris,

On 03/26/2012 11:50 PM, Chris Angelico wrote:
> On Tue, Mar 27, 2012 at 7:26 AM, Gelonida N <gelon...@gmail.com> wrote:
>> One option I though of would be:
>>
>> def obsolete_func(func):
>>    def call_old(*args, **kwargs):
>>        print "func is old psl use new one"
>>        return func(*args, **kwargs)
>>    return call_old
>>
>> and
>>
>> def get_time(a='high'):
>>   return a + 'noon'
> 
> That's a reasonable idea. Incorporate Dan's suggestion of using
> DeprecationWarning.
> 
Will do that.

> You may want to try decorator syntax:
> 
> def was(oldname):
>       def _(func):
>               globals()[oldname]=func
>               return func
>       return _
> 
> @was("get_thyme")
> def get_time(a='high'):
>    return a + 'noon'
> 
> That won't raise DeprecationWarning, though. It's a very simple
> assignment. The was() internal function could be enhanced to do a bit
> more work, but I'm not sure what version of Python you're using and
> what introspection facilities you have. But if you're happy with the
> old versions coming up with (*args,**kwargs) instead of their
> parameter lists, it's not difficult:

I'm using python 2.6 and sometimes still 2.5 (the latter is not
important for this question though)


Good idea about the decorators.
I overlooked to see, that if done properly a decorator will not add call
time overhead for calling the function with it's new name

> 
> def was(oldname):
>       def _(func):
>               def bounce(*args,**kwargs):
>                       # raise DeprecationWarning
>                       return func(*args,**kwargs)
>               globals()[oldname]=bounce
>               return func
>       return _
> 
> I've never actually used the Python warnings module, but any line of
> code you fill in at the comment will be executed any time the old name
> is used. In any case, it's still used with the same convenient
> decorator. You could even unify multiple functions under a single new
> name:
> 
> @was("foo")
> @was("bar")
> def quux(spam,ham):
>     return ham.eat()
> 
Now the next step will do write a decorator working for class methods.
I think I have a solution, but it would require to pass the class as
additional parameter to each decorator.

it would be
setattr(cls, oldname, finc)

> Hope that helps!
It does. Thanks again.

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to