我已经重命名了一个作为库一部分的 python 类。我愿意留下一个可能性,使用它以前的名称一段时间,但想警告用户,它是过时的,将在未来被删除。
我认为,为了提供向下兼容,使用这样的化名就足够了:
class NewClsName:
pass
OldClsName = NewClsName
I have no idea how to mark the OldClsName
as deprecated in an elegant way. Maybe I could make OldClsName
a function which emits a warning (to logs) and constructs the NewClsName
object from its parameters (using *args
and **kvargs
) but it doesn't seem elegant enough (or maybe it is?).
然而,我不知道 Python 标准库弃用警告是如何工作的。我猜想可能会有一些很好的魔法来处理弃权问题,例如允许将其视为错误或根据某些解释器的命令行选项使其静音。
问题是: 如何警告用户使用过时的类别名(或一般的过时类)。
EDIT : 函数方法对我来说不起作用(我已经试过了) ,因为这个类有一些类方法(工厂方法) ,当 OldClsName
被定义为一个函数时,这些类方法不能被调用。下面的代码不起作用:
class NewClsName(object):
@classmethod
def CreateVariant1( cls, ... ):
pass
@classmethod
def CreateVariant2( cls, ... ):
pass
def OldClsName(*args, **kwargs):
warnings.warn("The 'OldClsName' class was renamed [...]",
DeprecationWarning )
return NewClsName(*args, **kwargs)
OldClsName.CreateVariant1( ... )
因为:
AttributeError: 'function' object has no attribute 'CreateVariant1'
继承是我唯一的选择吗?老实说,在我看来它并不干净——它通过引入不必要的派生来影响类的层次结构。此外,OldClsName is not NewClsName
在大多数情况下不是一个问题,但是在使用库的代码写得很差的情况下可能是一个问题。
我还可以创建一个虚拟的、不相关的 OldClsName
类,并为其中的所有类方法实现构造函数和包装器,但在我看来,这是更糟糕的解决方案。