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
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.
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.
Add this code
to your index
page:
error_reporting(1);
ini_set('display_startup_errors', 0);
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:
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>
The import will execute the class definition, so put the warning there:
class Test:
raise DeprecationWarning('This class is deprecated')