2015-08-31 3 views
6

E 'possibile marcare classi deprecato in Python/PyCharm come questo:Marcatura una classe come deprecate classi in modo che ereditano sono contrassegnati in PyCharm

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

Qualsiasi codice cercando di creare un'istanza di Foo ora limite sarà opportunamente segnalato da PyCharm come Foo() .

Tuttavia, proprio ereditando la classe non sarà:

class Baz(Foo): 
    pass 

Esiste un modo per avere il dichiarazione di Baz segnato con un avvertimento deprecazione in qualche modo?

+0

Eventuali duplicati di [Come mettere in guardia sulla classe (nome) deprecazione] (http://stackoverflow.com/questions/9008444/how-to-warn -circa-class-name-disapprovazione) – Jerzyk

risposta

0

È possibile utilizzare una metaclasse per ottenere ciò. In 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 

Nota che al di fuori di PyCharm non si potrebbe vedere nulla perché warning di deprecazione sono disattivati ​​per impostazione predefinita.

In Python 3, cambiare Foo a:

class Foo(metaclass=deprecated_metaclass('Use Bar instead.')): 
    pass