Ostatnio dużo programowałem w Pythonie. Pracowałem z danymi, z którymi wcześniej nie pracowałem, używając formuł, których nigdy wcześniej nie widziałem i radziłem sobie z ogromnymi plikami. Wszystko to sprawiło, że napisałem wiele drukowanych oświadczeń, aby sprawdzić, czy wszystko idzie dobrze i zidentyfikować punkty awarii. Ale generalnie generowanie tak dużej ilości informacji nie jest dobrą praktyką. Jak używać instrukcji print tylko wtedy, gdy chcę debugować i pozwolić na ich pomijanie, gdy nie chcę, aby były drukowane?
109
level
wbasicConfig
wywołaniu nalogging.ERROR
.logging.basicConfig(stream=sys.stderr, level=logging.ERROR)
przyniesie żadnego efektu. Ponowne uruchomienie jądra i ustawienie nowego poziomu działa, ale to dla mnie obejście.Prostym sposobem na to jest wywołanie funkcji rejestrowania:
Następnie możesz zmienić wartość
DEBUG
i uruchomić kod z rejestrowaniem lub bez.Standardowy
logging
moduł ma do tego bardziej rozbudowany mechanizm.źródło
logging
działa (na bardzo prostym poziomie).Zamiast drukowania użyj wbudowanego modułu biblioteki rejestrowania .
Tworzysz
Logger
obiekt (powiedzmylogger
), a następnie, za każdym razem, gdy wstawiasz wydruk debugowania, po prostu wstawiasz:Możesz użyć
logger.setLevel
na początku programu, aby ustawić poziom wyjściowy. Jeśli ustawisz ją na DEBUG, wypisze wszystkie błędy. Ustaw go na INFO lub wyższą, a wszystkie błędy natychmiast znikną.Możesz go również użyć do rejestrowania poważniejszych rzeczy na różnych poziomach (INFO, WARNING i ERROR).
źródło
Po pierwsze, poproszę o nominację platformy logowania Pythona . Uważaj jednak, jak go używasz. W szczególności: pozwól platformie rejestrowania rozszerzyć twoje zmienne, nie rób tego sam. Na przykład zamiast:
upewnij się, że:
ponieważ chociaż wyglądają podobnie, pierwsza wersja ponosi koszt repr (), nawet jeśli jest wyłączona . Druga wersja tego uniknąć. Podobnie, jeśli zrobisz własne, zasugeruję coś takiego:
zadzwonił przez:
co znowu pozwoli uniknąć narzutów, jeśli wyłączysz go, wykonując:
Narzut obliczania tych ciągów prawdopodobnie nie ma znaczenia, chyba że są one albo 1) drogie do obliczenia, albo 2) instrukcja debugowania znajduje się w środku, powiedzmy, pętli n ^ 3 lub czegoś takiego. Nie to, żebym coś o tym wiedział.
źródło
Nie wiem o innych, ale byłem używany do zdefiniowania „stałej globalnej” (
DEBUG
), a następnie funkcji globalnej (debug(msg)
), która wyświetlałaby sięmsg
tylko wtedy, gdyDEBUG == True
.Następnie piszę instrukcje debugowania, takie jak:
... potem przechodzę testy jednostkowe i nigdy więcej tego nie zrobiłem! :)
źródło
print()
mój kod zostanie podniesiony do wymaganego poziomu, aby zdać test. Nigdy nie kończę z ogromną ilością wprint()
każdym miejscu. Rejestrowanie też jest fajne! :)