如何在Python中正确弃用自定义异常?

问题描述 投票:0回答:2

我的 Python 项目中有自定义继承异常,我想弃用其中之一。正确的做法是什么?

我有例外:

class SDKException(Exception):
    pass

class ChildException(SDKException):
    pass

class ChildChildException(ChildException):  # this one is to be deprecated
    pass

考虑到该异常是与项目中的其他异常一起使用、引发和链接的,我想弃用 ChildChildException。

python exception deprecated
2个回答
4
投票

您可以使用一个装饰器,在异常类的每个实例上显示 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)

0
投票

2024 年,你想使用
warnings.deprecated
装饰器。

根据Python 3.13(草案)发行说明

新的 warnings.deprecated() 装饰器提供了一种将弃用信息传达给 静态类型检查器 的方法,并警告使用已弃用的类和函数。当在运行时使用修饰函数或类时,也可能会发出运行时弃用警告。请参阅PEP 702

自 Python 3.13 起

您可以直接使用

warnings.deprecated

from warnings import deprecated

@deprecated
class ChildChildException(ChildException):
    pass

Python 3.12 或更早版本

如果您安装了

typing_extensions
软件包,则可以使用其
deprecated
成员作为 3.13 功能的直接替代品:

from typing_extensions import deprecated

@deprecated
class ChildChildException(ChildException):
    pass

如果您不能使用

typing_extensions
(或不想),请按照@alex_noname的解决方案中的说明实现自定义装饰器。

© www.soinside.com 2019 - 2024. All rights reserved.