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.
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. ..
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 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 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
Sie können in der Methode auch eine Nachricht wie folgt ausgeben.
import debtcollector
debtcollector.deprecate("This is no longer supported", version="1.0")
Mit ** deptcollector ** können Benutzer anscheinend einfach mithilfe eines Dekorateurs intelligent über veraltete Methoden informiert werden.