Seite 1 von 1

Alte API -> Neue API: Warnung ausgeben...

Verfasst: Dienstag 16. Juni 2015, 09:08
von jens
Werde eine Klasse umbenennen, will aber eine Zeitlang die alte ebenfalls noch anbieten und dazu eine warnung ausgeben. Wie machen?

Hier drei Varianten:

Code: Alles auswählen

import warnings


class NeueAPI(object):
    def test(self):
        print("NeueAPI: ok\n")


class AlteAPI1(object):
    def __new__(cls, *args, **kwargs):
        warnings.warn("Du nutzt AlteAPI1 !", FutureWarning, stacklevel=2)
        return NeueAPI()


class AlteAPI2(NeueAPI):
    def __new__(cls, *args, **kwargs):
        warnings.warn("Du nutzt AlteAPI2 !", FutureWarning, stacklevel=2)
        return NeueAPI.__new__(cls, *args, **kwargs)


class AlteAPI3(NeueAPI):
    def __new__(cls, *args, **kwargs):
        warnings.warn("Du nutzt AlteAPI3 !", FutureWarning, stacklevel=2)
        return super(AlteAPI3, cls).__new__(cls, *args, **kwargs)


if __name__ == "__main__":
    NeueAPI().test()
    AlteAPI1().test()
    AlteAPI2().test()
    AlteAPI3().test()
Alle drei funktionieren. Ausgabe:
NeueAPI: ok

test.py:34: FutureWarning: Du nutzt AlteAPI1 !
AlteAPI1().test()
NeueAPI: ok

test.py:35: FutureWarning: Du nutzt AlteAPI2 !
AlteAPI2().test()
NeueAPI: ok

test.py:36: FutureWarning: Du nutzt AlteAPI3 !
AlteAPI3().test()
NeueAPI: ok
Allerdings funktioniert in meinem echten Code (ein django.models.Field) nur die erste Variante. Bei den anderen Beiden erhalte ich den Fehler: TypeError: object() takes no parameters

Re: Alte API -> Neue API: Warnung ausgeben...

Verfasst: Dienstag 16. Juni 2015, 09:23
von Sirius3
@jens: die Meta-Klassen von django scheinen sich nicht so einfach täuschen zu lassen. Aber wenn Du sowieso ein NeueAPI-Objekt erzeugen willst und kein AlteAPI-Objekt, würde ich einfach eine Funktion schreiben:

Code: Alles auswählen

def AlteAPI1(*args, **kwargs):
    warnings.warn("Du nutzt AlteAPI1 !", FutureWarning, stacklevel=2)
    return NeueAPI(*args, **kwargs)

Re: Alte API -> Neue API: Warnung ausgeben...

Verfasst: Dienstag 16. Juni 2015, 10:15
von jens
Hm. Das über eine Funktion zu machen, darauf bin ich nicht gekommen.

Erscheint mir am einfachsten. Danke!

https://github.com/jedie/django-dbprefe ... c6e4ac7729 :D

Re: Alte API -> Neue API: Warnung ausgeben...

Verfasst: Dienstag 16. Juni 2015, 16:05
von DasIch
FutureWarning macht in diesem Kontext überhaupt keinen Sinn. Du solltest eine DeprecationWarning nutzen.

Re: Alte API -> Neue API: Warnung ausgeben...

Verfasst: Dienstag 16. Juni 2015, 17:30
von jens
Da hast du recht... aber da war irgendwas, warum ich DeprecationWarning nicht genommen hab...

Weil man sie normalerweise nicht sieht?!?

Re: Alte API -> Neue API: Warnung ausgeben...

Verfasst: Mittwoch 17. Juni 2015, 15:22
von DasIch
Stimmt dass tut man nicht. Du könntest aber deine eigene DeprecationWarning definieren die man sieht, wie es z.B. Django tut. Was auch immer du letztendlich tust, FutureWarning solltest du nicht nutzen weil die zum einen was anderes meint und zum anderen bei weitem nicht die Signalwirkung hat wie eine DeprecationWarning, deren Bedeutung und Konsequenzen jeder kennt.