[PYTHON] Kündigen Sie intelligent an, dass es sich um eine veraltete Implementierung handelt - debtcollerctor

In Python gibt es Warnungen, um den Benutzer des Moduls über veraltete Klassen und Methoden zu informieren.

Wenn Sie den folgenden Code ausführen

# -*- coding: utf-8 -*-
import warnings


def deprecated_method():
    warn_msg = "`deprecated_method` is deprecated and will be removed in v0.5"
    warnings.warn(warn_msg, UserWarning)
    print "I'm old"


if __name__ == '__main__':
    deprecated_method()

Sie sehen Warnungen wie unten gezeigt.

$ python warning_sample.py 
warning_sample.py:7: UserWarning: `deprecated_method` is deprecated and will be removed in v0.5
  warnings.warn(warn_msg, UserWarning)
I'm old

Dieses Mal möchte ich deptcollector vorstellen, das das Verfassen dieser veralteten Nachricht erleichtert.

Wie man Schuldeneintreiber benutzt

Meistens können Sie sich [Beispiele] ansehen (http://docs.openstack.org/developer/debtcollector/examples.html#removing-a-class-classmethod-method-function), aber ich werde es selbst versuchen. ..

veraltet für Klasse, Calssmethod, Methode, Funktion

Wenn die Methode in der Klasse veraltet ist, verwenden Sie den Dekorator @ removeeals.remove wie unten gezeigt.

# -*- coding: utf-8 -*-
from debtcollector import removals
import warnings

warnings.simplefilter('always')


class Car(object):
    @removals.remove
    def start(self):
        pass


if __name__ == '__main__':
    Car().start()

Das Ausführungsergebnis ist wie folgt.

$ python removals_sample.py 
removals_sample.py:15: DeprecationWarning: Using function/method 'Car.start()' is deprecated
  Car().start()

Warum brauche ich warnings.simplefilter ('immer') in meinem Code?

Standardmäßig wird @ removeeals.remove nicht angezeigt, da DeprecationWarning an warnings.warn übergeben und ausgeführt wird. Weitere Informationen zu Warnungen finden Sie unter Warnkategorie.

Sie können die Warnung auch in der Befehlszeile anzeigen, indem Sie die Option -W angeben, ohne sie in den Code zu schreiben. Löschen Sie warnings.simplefilter ('always') aus dem vorherigen Quellcode und führen Sie ihn wie folgt aus.

$ python -Wd removals_sample.py

... weggelassen file, filename, etc = imp.find_module(subname, path) removals_sample.py:15: DeprecationWarning: Using function/method 'Car.start()' is deprecated Car().start()

Andere Warnungen wurden zusammen mit dem Fehler Car (). Start () angezeigt. Wenn Sie eine eigene Bibliothek usw. erstellen, können Sie diese einmal ausprobieren.

Die Warnung an die Klasse lautet wie folgt.

@removals.remove
class Pinto(object):
    pass

Platzieren Sie Klassenmethoden über dem Dekorator @classmethod.

 class OldAndBusted(object):
    @removals.remove
    @classmethod
    def fix_things(cls):
        pass

Wenn Methode, Eigenschaft, Klasse, Schlüsselwort usw. in andere Namen geändert werden

Wenn sich der Funktionsname ändert, verwenden Sie move.moved_function.

# -*- coding: utf-8 -*-
from debtcollector import moves
import warnings
warnings.simplefilter('always')


def new_thing():
    return "new thing"

old_thing = moves.moved_function(new_thing, 'old_thing', __name__)


if __name__ == '__main__':
    print new_thing()
    print old_thing()

Wenn Sie es ausführen, können Sie sehen, dass die neue Methode aufgerufen wird, auch wenn Sie old_thing () aufrufen.

$ python moving_sample.py 
new thing
moving_sample.py:15: DeprecationWarning: Function '__main__.old_thing()' has moved to '__main__.new_thing()'
  print old_thing()
new thing

Im Falle einer Methode können Sie dies mit einem Dekorateur tun.

class Cat(object):
    @moves.moved_method('meow')
    def mewow(self):
        return self.meow()
    def meow(self):
        return 'kitty'

Weitere Beispiele finden Sie unter dem am Anfang eingeführten Link.

Geben Sie eine Version an, die in Zukunft ersetzt wird

Geben Sie die Schlüsselwörter version und remove_version wie folgt an, um die aktuelle Version und die zu ersetzende Version anzugeben:

# -*- coding: utf-8 -*-
from debtcollector import moves
import warnings
warnings.simplefilter('always')


def new_thing():
    return "new thing"

old_thing = moves.moved_function(new_thing, 'old_thing', __name__,
                                 version="0.5", removal_version="0.7")


if __name__ == '__main__':
    print new_thing()
    print old_thing()

Das Ausführungsergebnis ist wie folgt.

$ python moving_version_sample.py 
new thing
moving_version_sample.py:16: DeprecationWarning: Function '__main__.old_thing()' has moved to '__main__.new_thing()' in version '0.5' and will be removed in version '0.7'
  print old_thing()
new thing

Andere Methoden

Sie können in der Methode auch eine Nachricht wie folgt ausgeben.

import debtcollector
debtcollector.deprecate("This is no longer supported", version="1.0")

Zusammenfassung

Mit ** deptcollector ** können Benutzer anscheinend einfach mithilfe eines Dekorateurs intelligent über veraltete Methoden informiert werden.

Recommended Posts

Kündigen Sie intelligent an, dass es sich um eine veraltete Implementierung handelt - debtcollerctor
Wird nicht empfohlen, pip direkt zu verwenden?
mecab-python3 scheint unique-lite zu benötigen
Es wird gesagt, dass libmysqlclient.so.18 nicht existiert
Es ist eine Huckepack-Geschichte über den Dienst, der "Nyan" zurückgibt, wenn Sie Ping drücken