Show warning when a class is imported in python

Viewed 2095

I have a class in a different module and I want to show a DeprecationWarning when that class is imported. What will be the right way to do so?

module 1 contains -

class Test:
    pass

module 2 contains -

from module1 import Test #this line should show a DeprecationWarning.
4 Answers

The import will execute the class definition, so put the warning there:

class Test:
    raise DeprecationWarning('This class is deprecated')

You could use [Python 3.Docs]: warnings - Warning control, which states (emphasis is mine):

Changed in version 3.2: DeprecationWarning is now ignored by default in addition to PendingDeprecationWarning.

so, you'll have to "manually" enable it, otherwise it won't be visible when importing mod00. This way:

  • The warning will be displayed when importing or executing the module
  • The class can be instantiated as well

mod00.py:

#!/usr/bin/env python

import warnings
warnings.filterwarnings("default", category=DeprecationWarning, module=__name__)

print("Module mod00")


class Dummy:
    warnings.warn("Dummy class is deprecated", category=DeprecationWarning, stacklevel=2)


if __name__ == "__main__":
    print("Execute module mod00")

mod01.py:

#!/usr/bin/env python

from mod00 import Dummy


if __name__ == "__main__":
    print("Execute module mod01")
    dummy = Dummy()
    print(dummy)

Output:

e:\Work\Dev\StackOverflow\q060486000>sopr.bat
*** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***

[prompt]> "e:\Work\Dev\VEnvs\py_pc064_03.07.06_test0\Scripts\python.exe" -m mod00
Module mod00
e:\Work\Dev\StackOverflow\q060486000\mod00.py:9: DeprecationWarning: Dummy class is deprecated
  class Dummy:
Execute module mod00

[prompt]> "e:\Work\Dev\VEnvs\py_pc064_03.07.06_test0\Scripts\python.exe" mod00.py
Module mod00
mod00.py:9: DeprecationWarning: Dummy class is deprecated
  class Dummy:
Execute module mod00

[prompt]> "e:\Work\Dev\VEnvs\py_pc064_03.07.06_test0\Scripts\python.exe" -c "import mod00"
Module mod00
e:\Work\Dev\StackOverflow\q060486000\mod00.py:9: DeprecationWarning: Dummy class is deprecated
  class Dummy:

[prompt]> "e:\Work\Dev\VEnvs\py_pc064_03.07.06_test0\Scripts\python.exe" -m mod01
Module mod00
e:\Work\Dev\StackOverflow\q060486000\mod00.py:9: DeprecationWarning: Dummy class is deprecated
  class Dummy:
Execute module mod01
<mod00.Dummy object at 0x000001EBBC685488>

In your module1.py's Test class. add a warning in your init method:

import warnings


class Test:
    def __init__(self):
        warnings.warn('This class is deprecated', DeprecationWarning)

This will give you the below output, where if you hover on Test, you'll see a warning.

For that, you'll have to initialize the Test class.

enter image description here

If you want to show a warning on the import statement, you can call the warning in the module1.py file itself. However, that will happen for all your Classes in your module1.py file if you import them.

enter image description here

Add this code to your index page:

error_reporting(1);
ini_set('display_startup_errors', 0);
Related