情况:我的库中有一些自定义异常类,供用户在他们的代码中使用。出于某种原因,我想重命名其中一个异常并弃用旧的。
将旧异常保留为别名并不困难:
class MyNewError(ValueError):
pass
MyOldError = MyNewError
但最终我想删除我的库的旧错误名称,因此我希望在下游代码中使用此自定义异常的用户收到 DeprecationWarning 通知,告知此错误将被删除。
但我想在以下用例中引发 DeprecationWarning(假设我的包含自定义异常的库称为 mypackage
):
# downstream user code
import mypackage
...
try:
....
except mypackage.MyOldError:
....
所以我想在用户试图捕获错误时发出警告,而不仅仅是在用户引发错误时发出警告。
是否可以通过某种方式做到这一点? (因为用户没有在这里调用我可以提出弃用警告的函数)
最佳答案
您可以应用来自 this answer 的 hack/trick ,将您的模块转换为一个类并拦截 __getattr__()
操作:
我的包/__init__.py:
import sys
import warnings
class MyNewError(ValueError):
pass
MyOldError = MyNewError
def foo():
print('mypackage.foo(): raising MyNewError')
raise MyNewError()
class Wrapper(object):
def __init__(self, wrapped):
self.wrapped = wrapped
def __getattr__(self, name):
if name == 'MyOldError':
warnings.warn('MyOldError is deprecated, use MyNewError')
return getattr(self.wrapped, name)
sys.modules[__name__] = Wrapper(sys.modules[__name__])
测试.py:
import mypackage
try:
mypackage.foo()
except mypackage.MyOldError:
print('Caught mypackage.MyOldError')
输出:
$ python test.py
mypackage.foo(): raising MyNewError
mypackage/__init__.py:18: UserWarning: MyOldError is deprecated, use MyNewError
warnings.warn('MyOldError is deprecated, please use MyNewError')
Caught mypackage.MyOldError
关于python - 是否可以弃用异常类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40545005/