Muszę oznaczyć procedury jako przestarzałe, ale najwyraźniej nie ma standardowego dekoratora biblioteki, który mógłby zostać wycofany. Znam przepisy na to i moduł ostrzeżeń, ale moje pytanie brzmi: dlaczego nie ma standardowego dekoratora biblioteki dla tego (powszechnego) zadania?
Dodatkowe pytanie: czy w ogóle istnieją standardowe dekoratory w bibliotece standardowej?
Odpowiedzi:
Oto fragment, zmodyfikowany na podstawie cytowanych przez Leandro:
Ponieważ w niektórych tłumaczach pierwsze ujawnione rozwiązanie (bez obsługi filtra) może skutkować pominięciem ostrzeżenia.
źródło
functools.wraps
zamiast ustawiać nazwy i dokumentu w ten sposób?Oto inne rozwiązanie:
Ten dekorator ( w rzeczywistości fabryka dekoratorów ) pozwala podać przyczynę . Bardziej przydatna jest również pomoc programiście w zdiagnozowaniu problemu, podając nazwę pliku źródłowego i numer wiersza .
EDYCJA : Ten kod używa zalecenia Zero: zastępuje
warnings.warn_explicit
wiersz przezwarnings.warn(msg, category=DeprecationWarning, stacklevel=2)
, co powoduje wyświetlenie witryny wywołania funkcji, a nie witryny definicji funkcji. Ułatwia debugowanie.EDIT2 : Ta wersja umożliwia programistom określenie opcjonalnego komunikatu „powód”.
Możesz użyć tego dekoratora dla funkcji , metod i klas .
Oto prosty przykład:
Dostaniesz:
EDIT3: ten dekorator jest teraz częścią przestarzałej biblioteki:
Nowa stabilna wersja 1.2.10 🎉
źródło
warn_explicit
wiersz,warnings.warn(msg, category=DeprecationWarning, stacklevel=2)
który drukuje witrynę wywołania funkcji, zamiast witryny definicji funkcji. Ułatwia debugowanie.Jak zasugerował muon , możesz w tym celu zainstalować
deprecation
pakiet.Instalacja
Przykładowe użycie
Zobacz http://deprecation.readthedocs.io/, aby uzyskać pełną dokumentację.
źródło
Wydaje mi się, że powodem jest to, że kod Pythona nie może być przetwarzany statycznie (jak to miało miejsce w przypadku kompilatorów C ++), nie można uzyskać ostrzeżenia o używaniu niektórych rzeczy przed ich faktycznym użyciem. Nie sądzę, że dobrym pomysłem jest spamowanie użytkownika twojego skryptu za pomocą kilku wiadomości „Ostrzeżenie: ten programista tego skryptu używa wycofanego interfejsu API”.
Aktualizacja: ale możesz stworzyć dekorator, który przekształci oryginalną funkcję w inną. Nowa funkcja zaznaczy / sprawdzi przełącznik informujący, że ta funkcja została już wywołana i pokaże komunikat tylko po przełączeniu przełącznika w stan włączenia. I / lub przy wyjściu może wypisać listę wszystkich przestarzałych funkcji używanych w programie.
źródło
Możesz utworzyć plik utils
Następnie zaimportuj dekorator wycofania w następujący sposób:
źródło
AKTUALIZACJA: Myślę, że jest lepiej, gdy pokazujemy DeprecationWarning tylko za pierwszym razem dla każdej linii kodu i kiedy możemy wysłać wiadomość:
Wynik:
Możemy po prostu kliknąć ścieżkę ostrzegawczą i przejść do linii w PyCharm.
źródło
Rozszerzając tę odpowiedź Stevena Vascellaro :
Jeśli używasz Anacondy, najpierw zainstaluj
deprecation
pakiet:Następnie wklej poniższy fragment na górze pliku
Zobacz http://deprecation.readthedocs.io/, aby uzyskać pełną dokumentację.
źródło