Я переименовал класс python, который является частью библиотеки. Я готов оставить возможность использовать свое предыдущее имя некоторое время, но хотел бы предупредить пользователя о том, что он устарел и будет удален в будущем.
Я думаю, что для обеспечения обратной совместимости будет достаточно использовать такой псевдоним:
class NewClsName:
pass
OldClsName = NewClsName
Я понятия не имею, как пометить OldClsName
как устаревшее элегантным способом. Возможно, я мог бы сделать OldClsName
функцию, которая выдает предупреждение (для журналов) и строит объект NewClsName
из своих параметров (используя *args
и **kvargs
), но он не выглядит достаточно элегантным (или, может быть,?).
Однако я не знаю, как работают предупреждения об устаревании стандартной библиотеки Python. Я предполагаю, что может быть какая-то приятная магия, чтобы справиться с устареванием, например. позволяя рассматривать его как ошибки или молчание в зависимости от опции командной строки интерпретатора.
Возникает вопрос: как предупредить пользователей об использовании устаревшего псевдонима класса (или устаревшего класса в целом).
EDIT: функциональный подход не работает для меня (я уже попробовал), потому что класс имеет некоторые методы класса (методы factory), которые нельзя вызвать, когда 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
и реализовать конструктор, а также обертки для всех методов класса в нем, но, на мой взгляд, это еще хуже.