将类标记为已弃用,以便在 PyCharm 中标记继承类

Marking a class as deprecated so inheriting classes are marked in PyCharm

提问人:deceze 提问时间:8/31/2015 更新时间:10/28/2023 访问量:3546

问:

可以在 Python/PyCharm 中标记已弃用的类,如下所示:

class Foo:
    def __init__(self):
        warnings.warn('Use Bar instead.', DeprecationWarning)

现在尝试实例化的任何代码都将被 PyCharm 适当地标记为 Foo()。Foo

但是,仅继承该类不会:

class Baz(Foo):
    pass

有没有办法以任何方式将声明标记为弃用警告?Baz

python-3.x pycharm

评论

0赞 Jerzyk 7/1/2016
如何警告类(名称)弃用的可能副本
0赞 Marcel Wilson 1/26/2022
@deceze,您看到仍然可以在最新版本的 PyCharm 中标记已弃用的类?你的帖子是我唯一能找到的甚至提到它的帖子,但似乎无法让它工作。
0赞 Brian61354270 10/28/2023
相关 PEP: PEP 702 – 使用类型系统标记弃用

答:

0赞 Luke Moore 1/24/2017 #1

您可以使用元类来实现此目的。在 Python 2.7 中:

import warnings

def deprecated_metaclass(message):
    class DeprecatedMetaclass(type):
        def __init__(cls, name, bases, dct):
            if not hasattr(cls, '__metaclass__'):
                cls.__metaclass__ = DeprecatedMetaclass
            if any(getattr(base, '__metaclass__', None) == DeprecatedMetaclass
                    for base in bases):
                warnings.warn(message, DeprecationWarning, stacklevel=2)
            super(DeprecatedMetaclass, cls).__init__(name, bases, dct)

class Foo(object):
    __metaclass__ = deprecated_metaclass('Use Bar instead.')

class Bar(Foo):
    pass

请注意,在 PyCharm 之外,您可能看不到任何内容,因为弃用警告默认处于关闭状态。

在 Python 3 中,将 Foo 更改为:

class Foo(metaclass=deprecated_metaclass('Use Bar instead.')):
    pass
0赞 hasii 10/28/2023 #2

如果要避免自定义代码,请查看已弃用的包

允许您使用批注。它维护得很好