Tutorial¶
In this tutorial, we will use the Deprecated Library to mark pieces of codes as deprecated. We will also see what’s happened when a user tries to call deprecated codes.
Deprecated function¶
First, we have this little library composed of a single module: liberty.py
:
# coding: utf-8
""" Liberty library is free """
import pprint
def print_value(value):
"""
Print the value
:param value: The value to print
"""
pprint.pprint(value)
You decided to write a more powerful function called better_print()
which will become a replacement of print_value()
.
And you decided that the later function is deprecated.
To mark the print_value()
as deprecated, you can use the deprecated()
decorator:
# coding: utf-8
""" Liberty library is free """
import pprint
from deprecated import deprecated
@deprecated
def print_value(value):
"""
Print the value
:param value: The value to print
"""
pprint.pprint(value)
def better_print(value, printer=None):
"""
Print the value using a *printer*.
:param value: The value to print
:param printer: Callable used to print the value, by default: :func:`pprint.pprint`
"""
printer = printer or pprint.pprint
printer(value)
If the user tries to use the deprecated functions, he will have a warning for each call:
# coding: utf-8
import liberty
liberty.print_value("hello")
liberty.print_value("hello again")
liberty.better_print("Hi Tom!")
$ python use_liberty.py
using_liberty.py:4: DeprecationWarning: Call to deprecated function print_value.
liberty.print_value("hello")
'hello'
using_liberty.py:5: DeprecationWarning: Call to deprecated function print_value.
liberty.print_value("hello again")
'hello again'
'Hi Tom!'
As you can see, the deprecation warning is displayed like a stack trace. You have the source code path and line number and the called function. This is very useful for debugging. But, this doesn’t help the developer to choose a alternative: which function could he use instead?
To help the developer, you can add a “reason” message. For instance:
# coding: utf-8
""" Liberty library is free """
import pprint
from deprecated import deprecated
@deprecated("This function is rotten, use 'better_print' instead")
def print_value(value):
"""
Print the value
:param value: The value to print
"""
pprint.pprint(value)
def better_print(value, printer=None):
"""
Print the value using a *printer*.
:param value: The value to print
:param printer: Callable used to print the value, by default: :func:`pprint.pprint`
"""
printer = printer or pprint.pprint
printer(value)
When the user calls the deprecated functions, he will have a more useful message:
$ python use_liberty.py
using_liberty.py:4: DeprecationWarning: Call to deprecated function print_value (This function is rotten, use 'better_print' instead).
liberty.print_value("hello")
'hello'
using_liberty.py:5: DeprecationWarning: Call to deprecated function print_value (This function is rotten, use 'better_print' instead).
liberty.print_value("hello again")
'hello again'
'Hi Tom!'
Deprecated method¶
Decorating a deprecated method works like decorating a function.
# coding: utf-8
""" Liberty library is free """
import pprint
from deprecated import deprecated
class Liberty(object):
def __init__(self, value):
self.value = value
@deprecated("This method is rotten, use 'better_print' instead")
def print_value(self):
""" Print the value """
pprint.pprint(self.value)
def better_print(self, printer=None):
"""
Print the value using a *printer*.
:param printer: Callable used to print the value, by default: :func:`pprint.pprint`
"""
printer = printer or pprint.pprint
printer(self.value)
When the user calls the deprecated methods, like this:
# coding: utf-8
import liberty
obj = liberty.Liberty("Greeting")
obj.print_value()
obj.print_value()
obj.better_print()
He will have:
$ python use_liberty.py
using_liberty.py:5: DeprecationWarning: Call to deprecated function print_value (This method is rotten, use 'better_print' instead).
obj.print_value()
'Greeting'
using_liberty.py:6: DeprecationWarning: Call to deprecated function print_value (This method is rotten, use 'better_print' instead).
obj.print_value()
'Greeting'
'Greeting'
Note
The call is done to the same object, so we have 3 times ‘Greeting’.
Deprecated class¶
You can also decide that a class is deprecated.
For instance:
# coding: utf-8
""" Liberty library is free """
import pprint
from deprecated import deprecated
@deprecated("This class is not perfect")
class Liberty(object):
def __init__(self, value):
self.value = value
def print_value(self):
""" Print the value """
pprint.pprint(self.value)
When the user use the deprecated class like this:
# coding: utf-8
import liberty
obj = liberty.Liberty("Salutation")
obj.print_value()
obj.print_value()
He will have a warning at object instantiation. Once the object is initialised, no more warning are emitted.
$ python use_liberty.py
using_liberty.py:4: DeprecationWarning: Call to deprecated class Liberty (This class is not perfect).
obj = liberty.Liberty("Salutation")
'Salutation'
'Salutation'