【问题标题】:Marking a class as deprecated so inheriting classes are marked in PyCharm将类标记为已弃用,因此在 PyCharm 中标记继承类
【发布时间】:2015-11-25 13:54:43
【问题描述】:

可以像这样在 Python/PyCharm 中标记已弃用的类:

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

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

但是,仅仅继承类不会:

class Baz(Foo):
    pass

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

【问题讨论】:

标签: python python-3.x pycharm


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 2010-09-22
    • 1970-01-01
    相关资源
    最近更新 更多