将类标记为已弃用,因此继承类在PyCharm中标记

dec*_*eze 7 python pycharm python-3.x

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

class Foo:
    def __init__(self):
        warnings.warn('Use Bar instead.', DeprecationWarning)
Run Code Online (Sandbox Code Playgroud)

Foo现在任何试图实例化的代码都会被PyCharm标记为Foo().

但是,继承该类不会:

class Baz(Foo):
    pass
Run Code Online (Sandbox Code Playgroud)

有什么办法有声明Baz标记以任何方式产生警告?

Luk*_*ore 0

您可以使用元类来完成此任务。在 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
Run Code Online (Sandbox Code Playgroud)

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

在 Python 3 中,将 Foo 更改为:

class Foo(metaclass=deprecated_metaclass('Use Bar instead.')):
    pass
Run Code Online (Sandbox Code Playgroud)