Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Show warning when a class is imported in python

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.
like image 425
Nirmal Avatar asked Mar 02 '20 09:03

Nirmal


2 Answers

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

class Test:
    raise DeprecationWarning('This class is deprecated')
like image 177
Jussi Nurminen Avatar answered Oct 20 '22 19:10

Jussi Nurminen


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>
like image 42
CristiFati Avatar answered Oct 20 '22 20:10

CristiFati