我的 Python 项目中有自定义继承异常,我想弃用其中之一。正确的做法是什么?
我有例外:
class SDKException(Exception):
pass
class ChildException(SDKException):
pass
class ChildChildException(ChildException): # this one is to be deprecated
pass
考虑到该异常是与项目中的其他异常一起使用、引发和链接的,我想弃用 ChildChildException。
您可以使用一个装饰器,在异常类的每个实例上显示 warning
DeprecationWarning
类别:
import warnings
warnings.filterwarnings("default", category=DeprecationWarning)
def deprecated(cls):
original_init = cls.__init__
def __init__(self, *args, **kwargs):
warnings.warn(f"{cls.__name__} is deprecated", DeprecationWarning, stacklevel=2)
original_init(self, *args, **kwargs)
cls.__init__ = __init__
return cls
class SDKException(Exception):
pass
class ChildException(SDKException):
pass
@deprecated
class ChildChildException(ChildException): # this one is to be deprecated
pass
try:
raise ChildChildException()
except ChildChildException:
pass
app.py:7: DeprecationWarning: ChildChildException is deprecated
更新: 此外,您可以创建自定义警告类并将其传递给警告函数:
class ExceptionDeprecationWarning(Warning):
pass
warnings.warn(f"{cls.__name__} is deprecated", ExceptionDeprecationWarning)
warnings.deprecated
装饰器。根据Python 3.13(草案)发行说明,
新的 warnings.deprecated() 装饰器提供了一种将弃用信息传达给 静态类型检查器 的方法,并警告使用已弃用的类和函数。当在运行时使用修饰函数或类时,也可能会发出运行时弃用警告。请参阅PEP 702。
您可以直接使用
warnings.deprecated
:
from warnings import deprecated
@deprecated
class ChildChildException(ChildException):
pass
如果您安装了
typing_extensions
软件包,则可以使用其 deprecated
成员作为 3.13 功能的直接替代品:
from typing_extensions import deprecated
@deprecated
class ChildChildException(ChildException):
pass
如果您不能使用
typing_extensions
(或不想),请按照@alex_noname的解决方案中的说明实现自定义装饰器。