2015-08-31 4 views
6

Можно отметить устаревшие классы в Python/PyCharm так:Пометка класс как устаревшие, так наследующих классов отмечены PyCharm

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

Любой код пытается создать экземпляр Foo теперь будет надлежащим образом отмеченную PyCharm в Foo() .

Однако, только наследуя класс не:

class Baz(Foo): 
    pass 

Есть ли способ, чтобы иметь декларацию из Baz помеченный предупреждения устаревания каким-либо образом?

+0

Возможный дубликат [Как предупредить о классе (имя) устаревания] (http://stackoverflow.com/questions/9008444/how-to-warn -О-класс-имя-устаревания) – Jerzyk

ответ

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 

Обратите внимание, что за пределами PyCharm вы можете не увидеть ничего, потому что устаревания предупреждения по умолчанию отключены.

В Python 3, изменить Foo на:

class Foo(metaclass=deprecated_metaclass('Use Bar instead.')): 
    pass 
Смежные вопросы