在不牺牲将来的证明/向后兼容性的情况下,专门处理python DeprecationWarnings的正确方法是什么?我希望我的代码与python 2.x和3.x兼容,并且我想优雅地处理DeprecationWarnings,以便它们不会总是被抛出,并且进一步使我的代码不会在最终版本上失败删除不推荐使用的方法。我可以想到一些方法来做到这一点,但在python文档中或SO上找不到“正确”的方法。
最小示例(使用检查,但这是一个普遍的问题):
import warnings
import inspect
def f(foo='bar'):
return foo
# Version 1: won't work when getargspec is out of the code base
with warnings.catch_warnings():
warnings.filterwarnings('error')
try:
print(inspect.getargspec(f).args)
print('old way')
except DeprecationWarning:
print(inspect.getfullargspec(f).args)
print('new way')
# Version 2: nonspecific
try:
print(inspect.getfullargspec(f).args)
print('new way')
except:
print(inspect.getargspec(f).args)
print('old way')
2.x输出:
['foo']
old way
['foo']
old way
3.x输出:
['foo']
new way
['foo']
new way
版本1是特定的,但是一旦不赞成使用的方法最终消失了就无法使用,但是版本2感觉太不确定了。第三个版本是显式检查python版本。许多图书馆似乎只是采用第四种形式,只是让警告堆积如山,这似乎也不对。这里正确的设计原则是什么?
问题:在不牺牲将来的证明/向后兼容性的情况下,专门处理DeprecationWarnings的正确方法是什么?