10 mniej znanych funkcji PyCharma

Większość użytkowników Pythona zapewne spotkała się ze środowiskiem PyCharm, wiele z nas używa go na co dzień. Bardzo wielu użytkowników jednak nie zna niektórych bardzo pomocnych funkcjonalności tego wszechstronnego IDE. Zapraszam do artykułu, w którym prezentuję 10 trików i mniej znanych funkcji PyCharma, które ułatwią Wam pracę z kodem. Skróty klawiszowe, nazwy funkcjonalności i screenshoty zostały wzięte z wersji 2018.3 PRO z interfejsem w języku angielskim, z interpreterem Pythona 3.


Artur Patoka. Software automation engineer w norweskim oddziale firmy Arm. Na co dzień posługuje się Pythonem i zajmuje się pisaniem automatyzujących skryptów z nastawieniem na minimalizowanie nakładu ludzkiej, manualnej pracy. Poza biurem zajmuje się też uczeniem programowania w Kiwi learning, którego jest współzałożycielem. Wolne chwile spędza na rowerze, w podróżach i na śledzeniu newsów w temacie eksploracji kosmosu.


Wpinanie się w instancję interpretera

Debugger to narzędzie, które pozwala wstrzymać egzekucję skryptu bądź programu i… No właśnie. Spotkałem się z wieloma programistami, z różnym doświadczeniem, którzy debuggerów używają niechętnie, albo w bardzo podstawowym zakresie, nie do końca wiedząc ile tracą. Tymczasem PyCharm pozwala w bardzo łatwy sposób podejrzeć co dzieje się ze zmiennymi, którą linię kodu wykonuje interpreter, ale nie tylko.

Mniej znaną a bardzo przydatną funkcjonalnością jest wpinanie się w instancję interpretera, która wykonuje nasz kod.

Cokolwiek napiszemy w tym trybie będzie miało taki sam skutek, jak gdyby było częścią skryptu. Jeśli zmodyfikujemy zmienną, kolejne wykonywane linie będę używały zmienionej przez nas zmiennej. Jeśli wywołamy metodę, która usunie instancję danej klasy, ten obiekt nie będzie dostępny dla dalszej części skryptu. Jeśli za to wywołamy metodę, która spowoduje podniesienie wyjątku – jesteśmy „bezpieczni”, bo w trybie interaktywnym wyjątki nie powodują zatrzymania interpretera.

O samym debuggerze można by napisać oddzielny artykuł, więc tylko krótko krótkie wspomnienie pozostałych funkcji, które warto poznać bliżej.

  • Step over, Step into, Step out, Run to cursor: to są Twoi przyjaciele podczas kontrolowej egzekucji kodu, kiedy potrzebujesz dużo kontroli nad tym, na której linii kodu zatrzyma się Twój interpreter. Więcej szczegółowych informacji tutaj.
  • Okienko “Frames”: widoczne w lewym dolnym rogu podczas debugu, pozwala zmieniać scope. Jeśli jesteśmy wewnątrz metody, którą wywołała inna metoda, możemy “przenieść się” do scopu metody wywołującej i podejrzeć jak z jej perspektywy wyglądają dostępne zmienne itd.
  • Add to watches: w trybie debugu kliknięcie prawym przyciskiem myszy na nazwie zmiennej pozwala na dostęp do funkcji “Add to watches”. W ten sposób możemy szybko dodać zmienną do obserwowanych, widocznych z prawej strony ekranu przy widoku debugu.

Warunkowe breakpointy

Debugger to bardzo użyteczne narzędzie, ale jak zmusić go do zatrzymania w odpowiednim momencie? Klikając na przestrzeń z lewej strony wiersza, tak jak w większości innych IDE, dodajemy breakpoint, czyli zaznaczamy linię, przed wykonaniem której zatrzyma się interpreter i włączy widok debuggowy. Breakpointy mogą być jednak jeszcze bardziej użyteczne — klikając na nie prawym klawiszem uzyskujemy dostęp do dwóch dodatkowych funkcjonalności. Po pierwsze, jesteśmy w stanie wskazać czy chcemy zatrzymać bieżący wątek czy wszystkie wątki uruchomione przez nasz skrypt. Po drugie, możemy wskazać PyCharmowi warunek, który musi zostać spełniony, aby egzekucja została wstrzymana. Warunek zostanie oceniony pod kątem jego wartości logicznej (True/False) w taki sam sposób, jak w konstrukcji if warunek. Jest to niezwykle użyteczne narzędzie, kiedy chcemy zatrzymać skrypt w konkretnej iteracji pętli czy kiedy metoda jest wywoływana z konkretnymi argumentami.

Kilka niezbędnych skrótów klawiszowych

ctrl+shift+a

Przywołuje okienko szybkiego szukania pośród “akcji”. Co to właściwie znaczy? Każdy przycisk, pole tekstowe, czy pozycję z menu kontekstowego możemy znaleźć właśnie w ten sposób. Żeby szybko dostać się do zainstalowanych wtyczek wystarczy użyć tej kombinacji i wpisać “plugins”. Żeby wrócić do poprzedniego miejsca, w którym był kursor możemy wpisać tam “back”. Możliwe jest też używanie akronimów — żeby szybko znaleźć plik w drzewku projektu, używamy pozycji “Select in Project View”, którą możemy znaleźć wpisując tylko “sip”.

alt+enter

Ten skrót wymusza na naszym IDE otwarcie tego samego menu, które otwiera się po kliknięciu na symbol żarówki, np. w przypadku podkreślenia “weak warning”.  W ten sposób możemy szybko dodać docstring, adnotacje typu czy zamienić metodę nie odwołującą się do self na metodę statyczną.

ctrl+shift+n

Szczególnie przydatne w dużych projektach z wieloma plikami: ten skrót przywołuje znane z pierwszego podpunktu okienko szukania w trybie szukania plików. Tutaj również możemy używać maski “*” czy akronimów.

ctrl+shift+f

Szukanie w szerszym scope. Domyślnie szuka w projekcie, możemy też wybrać wyszukiwanie np. w wybranym katalogu.

ctrl+p

Podczas wołania funkcji ten skrót przywołuje pop-up z podpowiedziami co do oczekiwanych argumentów.

Diff tools

Pycharm dostarcza bardzo wygodne narzędzia do porównywania plików, wersji repozytorium, historii czy stringów. Najprostszy tryb to porównywanie plików — wystarczy zaznaczyć dwa pliki w drzewku projektu i w menu kontekstowym (prawy przycisk myszy) znaleźć pozycję “Compare Files”, czy po prostu użyć skrótu ctrl+d.

W ten sam sposób możemy sprawdzić historię naszych zmian (prawy przycisk myszy -> Local History -> Show History) czy porównać obecną wersję z konkretną wersją w repozytorium, o ile nasz projekt jest wersjonowany (prawy przycisk myszy -> TODO: upewnić się).

W ten sam sposób można porównać wartości dwóch zmiennych z widoku debuggera, czy nawet dowolnych stringów (kopiujemy pierwszy do schowka, zaznaczamy drugi i prawy przycisk myszy -> Compare With Clipboard).

Annotate, czyli szybkie szukanie winnych

PyCharm jest świetnie zintegrowany z systemami wersjonowania. Jeśli nasz projekt jest wersjonowany np. gitem, mamy dostęp nie tylko do zakładki Version Control u dołu standardowego widoku, ale też do funkcji Annotate. Ustawiamy kursor na numerze wiersza (po lewej stronie od kodu) -> prawy przycisk myszy -> Annotate.

W ten sposób widzimy identyfikator osoby, która jako ostatnia zmieniała daną linię i datę tej zmiany. Klikając na ten obszar, możemy podejrzeć commit.

Type hinting i adnotacja typów

Tematowi adnotacji typów w Pythonie warto poświęcić osobny artykuł, w tym akapicie skupimy się tylko na tym, w jaki sposób to usprawnia współpracę dewelopera z IDE.

Type hints

Najprościej wytłumaczyć czym jest type hinting na przykładzie.

Często potrzebujemy zadeklarować zmienną zanim przypiszemy jej wartość. W takiej sytuacji możemy ustawić jej inicjalną wartość jako “None”, ale dodać wskazówkę co do typu. Dzięki temu IDE, tutaj PyCharm wie jakie podpowiedzi nam pokazywać.

Python wspiera też określanie typów argumentów funkcji (metod). Dzięki temu nie tylko dostaniemy bardziej trafne podpowiedzi używając skrótu ctrl+p, ale też zostaniemy ostrzeżeni przed niespodziewanym typem argumentu.

Coverage, czyli sprawdzanie skuteczności testowania i nie tylko

PyCharm w bardzo przyjazny sposób pozwala na sprawdzanie, które linie kodu zostały wykonane podczas danej egzekucji. W ten prosty sposób możemy dowiedzieć się, jakie jest pokrycie testami, które linie zostały przetestowane, czy których lini innego pakietu, który importujemy, używa nasz kod.

Wtyczki

Używasz jiry do logowania pracy? Wtyczka „Jira integration” czeka na Ciebie. Piszesz w bashu? „BashSupport” czeka. Do code review używasz Gerrita? Nic prostszego, wystarczy pobrać wtyczkę „Gerrit” i od tej pory obsługiwać review kodu z poziomu IDE.

PyCharm ma bogate repozytorium oficjalnych i nieoficjalnych wtyczek, które potrafią bardzo ułatwić pracę. Do przeglądania dostępnych wtyczek nie potrzeba nawet przeglądarki, wystarczy otworzyć okno „Plugins”, do którego najłatwiej dostać się skrótem klawiszowym opisanym kilka akapitów wyżej. Znajdziemy tam wtyczki od najbardziej podstawowych (np. Markup) do bardzo specjalistycznych (np. MicroPython, która obsługuje edukacyjną płytkę Micro:Bit i automatyzuje proces kompilacji i kopiowania plików do pamięci urządzenia).

PyCharm Pro: Profiler

PyCharm Pro to bardziej rozbudowana, płata wersja środowiska PyCharm, która oferuje więcej funkcjonalności. Jedną z nich jest profilowanie kodu, czyli analiza pod kątem performancowym, służąca zbadaniu na co interpreter poświęca najwięcej czasu. W przypadku rozbudowanych projektów, szczególnie takich, które odpytują różne zasoby sieciowe, często zdarza się, że różne procesy zajmują więcej czasu niż to było oczekiwane. Użycie profilera (prawy przycisk myszy -> Profile ‘nazwa_pliku.py’) pokaże nam co dokładnie zabiera najwięcej czasu i ile razy jest wywoływane.

PyCharm Pro: Remote debugging

Drugą z funkcjonalności dostępnych tylko w wersji Pro jest zdalny debug. PyCharm Pro pozwala nam dodać jako interpreter projektu interpreter na innej maszynie, widocznej np. przez SSH. Na tej podstawie automatycznie tworzona jest konfiguracja do demploymentu. Po każdej naszej zmianie kodu, aktualizowana jest też automatycznie wersja na zdalnej maszynie, a w przypadku uruchamiania bądź debugu, kod faktycznie wykonywany jest na naszym targecie, a nie na lokalnej maszynie.

Cały proces jest całkowicie zautomatyzowany, a konfiguracja dla targetów używających Linuxa jest zupełnie bezbolesna, z punktu użytkownika ogranicza się tylko do podania danych logowania do maszyny zdalnej.

Podsumowanie

PyCharm ma wielką bazę wiedzy i dokumentacji online, która pomoże znaleźć rozwiązanie większości problemów. Nie wiesz jak walidować i włączyć podpowiedzi dla plików JSON podczas edycji z konkretnym JSON schema? JetBrains online help. Zastanawiasz się jak jak zmienić interpreter dla projektu? JetBrains online help. Chciałabyś, chciałbyś dowiedzieć się jak zmienić domyślne narzędzie PyCharma do porównywania plików na Twoje ulubione, np. Beyond Compare? Zgadliście, to też jest opisane w pomocy JetBrains.

Patronujemy

 
 
Polecamy
Czy Node.js naprawdę jest lepszy od PHP 7?