best way to create warning for obsolete functions and call new one

Gelonida N gelonida at gmail.com
Wed Mar 28 03:51:52 EDT 2012


Hi Chris,

On 03/26/2012 11:50 PM, Chris Angelico wrote:
> On Tue, Mar 27, 2012 at 7:26 AM, Gelonida N <gelonida at 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.




More information about the Python-list mailing list