158891
Book
In basket
Programowanie zgodne z duchem Pythona Ustalenie używanej wersji Pythona Stosuj styl PEP 8 Nigdy nie oczekuj, że Python wykryje błędy podczas kompilacji Decyduj się na funkcje pomocnicze zamiast na skomplikowane wyrażenia Zamiast indeksowania wybieraj rozpakowanie wielu operacji przypisania Krotkę jednoelementową zawsze umieszczaj w nawiasie W prostej logice osadzonej używaj wyrażeń warunkowych Unikaj powtórzeń w wyrażeniach przypisania Stosuj polecenie match w celu destrukturyzacji kontroli przepływu, ale unikaj go, gdy wystarczające będzie polecenie if Ciągi tekstowe i wycinki Różnice między typami bytes i str Wybieraj interpolowane ciągi tekstowe f zamiast ciągów tekstowych formatowania w stylu C i funkcji str.format() Różnice między wywołaniami repr i str podczas wyświetlania obiektów Wybieraj jawną konkatenację ciągu tekstowego zamiast niejawnej, zwłaszcza w przypadku listy Umiejętnie podziel sekwencje Unikaj użycia indeksów początek, koniec i wartości kroku w pojedynczej operacji podziału Wybieraj rozpakowanie typu catch-all zamiast tworzenia wycinków Pętle i iteratory Preferuj użycie funkcji enumerate() zamiast range() Używaj funkcji zip() do równoczesnego przetwarzania iteratorów Unikaj bloków else po pętlach for i while Nigdy nie używaj zmiennych pętli for po zakończeniu jej działania Podczas iteracji przez argumenty zachowuj postawę defensywną Nigdy nie modyfikuj kontenerów podczas iteracji przez nie, lecz skorzystaj z kopii lub pamięci podręcznej Przekazuj iteratory do wywołań any() i all() w celu skrócenia logiki Rozważ stosowanie modułu itertools w pracy z iteratorami i generatorami Słowniki Zachowaj ostrożność, gdy polegasz na kolejności wstawiania elementów do obiektu typu dict Podczas obsługi brakujących kluczy słownika wybieraj funkcję get() zamiast operatora in i wyjątku KeyError Podczas obsługi brakujących elementów w wewnętrznym stanie wybieraj typ defaultdict zamiast metody setdefault() Wykorzystaj metodę __missing__() do tworzenia wartości domyślnych w zależności od klucza Twórz klasy, zamiast zagnieżdżać wiele poziomów słowników, list i krotek. Funkcje Ustal, kiedy argumenty funkcji mogą być zmienione Zwróć obiekt, gdy funkcja ma rozpakować więcej niż trzy zmienne Preferuj wyjątki zamiast zwrotu wartości None Zobacz, jak domknięcia współdziałają z zakresem zmiennej Zmniejszenie wizualnego zagmatwania za pomocą zmiennej liczby argumentów pozycyjnych Zdefiniowanie zachowania opcjonalnego za pomocą argumentów w postaci słów kluczowych Użycie None i docstring w celu dynamicznego określenia argumentów domyślnych Wymuszaj czytelność kodu za pomocą argumentów w postaci słów kluczowych i argumentów jedynie pozycyjnych Dekoratory funkcji definiuj za pomocą functools.wraps Podczas łączenia funkcji preferuj functools.partial zamiast wyrażeń lambda Konstrukcje składane i generatory Używaj list składanych zamiast funkcji map() i filter() Unikaj więcej niż dwóch wyrażeń na liście składanej Stosuj wyrażenia przypisania, aby unikać powielania zadań w konstrukcjach składanych Rozważ użycie generatorów, zamiast zwracać listy Rozważ użycie generatora wyrażeń dla dużych list składanych Twórz wiele generatorów za pomocą wyrażenia yield from Iteratory przekazuj generatorom jako argumenty zamiast za pomocą metody send() Przejścia między stanami obsługuj za pomocą klasy, zamiast używać metody throw() Klasy i interfejsy Dla prostych interfejsów akceptuj funkcje zamiast klas Wybieraj zorientowany obiektowo polimorfizm zamiast funkcji z wywołaniami isinstance() W stylu programowania funkcyjnego używaj functools.singledispatch zamiast polimorfizmu zorientowanego obiektowo Używaj typu dataclasses zamiast lekkich klas
Użycie polimorfizmu @classmethod w celu ogólnego tworzenia obiektów Inicjalizacja klasy nadrzędnej za pomocą wywołania super() Rozważ łączenie funkcjonalności za pomocą klas domieszek Preferuj atrybuty publiczne zamiast prywatnych Wybieraj moduł dataclasses, zamiast tworzyć niemodyfikowalne obiekty Stosuj dziedziczenie po collections.abc w kontenerach typów niestandardowych Metaklasy i atrybuty Używaj zwykłych atrybutów zamiast metod typu getter i setter Rozważ użycie @property zamiast refaktoryzacji atrybutów Stosuj deskryptory, aby wielokrotnie wykorzystywać metody udekorowane przez @property Używaj metod __getattr__(), __getattribute__() i __setattr__() dla opóźnionych atrybutów Sprawdzaj podklasy za pomocą __init_subclass__ Rejestruj istniejące klasy za pomocą __init_subclass__() Adnotacje atrybutów klas dodawaj za pomocą metody __set_name__() Przemyśl kolejność definicji klasy, aby zdefiniować powiązania między atrybutami Dla złożonych rozszerzeń klas wybieraj dekoratory klas zamiast metaklas Współbieżność i równoległość Używaj modułu subprocess do zarządzania procesami potomnymi Użycie wątków dla operacji blokujących wejście-wyjście, unikanie równoległości Używaj klasy Lock, aby unikać stanu wyścigu w wątkach Używaj klasy Queue do koordynacji pracy między wątkami Naucz się rozpoznawać, kiedy współbieżność jest niezbędna Unikaj tworzenia nowych egzemplarzy Thread na żądanie fan-out Pamiętaj, że stosowanie Queue do obsługi współbieżności wymaga refaktoringu Rozważ użycie klasy ThreadPoolExecutor, gdy wątki są potrzebne do zapewnienia współbieżności Zapewnij wysoką współbieżność operacji wejścia-wyjścia dzięki użyciu współprogramów Naucz się przekazywać do asyncio wątkowane operacje wejścia-wyjścia Połączenie wątków i współprogramów w celu ułatwienia konwersji na wersję stosującą asyncio Maksymalizuj responsywność przez unikanie blokującej pętli zdarzeń asyncio Rozważ użycie concurrent.futures(), aby otrzymać prawdziwą równoległość Niezawodność Wykorzystuj zalety wszystkich bloków w konstrukcji try-except-else-finally Używaj polecenia assert dla wewnętrznych założeń i raise w przypadku niespełnionych oczekiwań Rozważ użycie poleceń contextlib i with w celu uzyskania wielokrotnego użycia konstrukcji try-finally Zawsze staraj się maksymalnie skracać blok try Uważaj na znikające zmienne wyjątku Uważaj podczas przechwytywania klasy Exception Poznaj różnicę między klasami Exception i BaseException Używaj modułu traceback w celu dostarczania dokładniejszych informacji o wyjątkach Rozważ jawne łączenie wyjątków, aby otrzymać przejrzyste stosy wywołań Zawsze przekazuj zasoby do generatorów i nakazuj komponentom wywołującym przeprowadzanie operacji porządkowych Nigdy nie przypisuj wartości False zmiennej __debug__ Unikaj wywołań exec() i eval(), o ile nie tworzysz narzędzia programistycznego Wydajność Przed optymalizacją przeprowadzaj profilowanie Wydajność działania kodu o znaczeniu krytycznym optymalizuj za pomocą testów wydajności modułu timeit Dostrzegaj, kiedy i jak zastąpić Pythona innym językiem programowania Rozważ użycie modułu ctypes w celu sprawnej integracji z bibliotekami natywnymi Rozważ użycie modułów rozszerzeń, aby zmaksymalizować wydajność działania i ergonomię Aby skrócić czas uruchamiania programu, korzystaj ze wstępnie skompilowanego kodu bajtowego i buforowania systemu plików Stosuj wczytywanie modułów z opóźnieniem i importowanie dynamiczne, aby skrócić czas uruchamiania programu Rozważ użycie typów memoryview i bytearray, gdy podczas pracy z typem bytes stosujesz tzw. kopiowanie zero Algorytmy i struktury danych Używaj parametru key podczas sortowania według skomplikowanych kryteriów Poznaj różnice między metodami sort() i sorted() Podczas wyszukiwania danych w sortowanych sekwencjach stosuj moduł bisect Wybieraj typ deque podczas tworzenia kolejek typu producent - konsument Przekonaj się, jak używać heapq w kolejce priorytetowej Podczas obsługi czasu lokalnego używaj modułu datetime zamiast time Gdy ważna jest precyzja, używaj modułu decimal Niezawodne użycie pickle wraz z copyreg Testowanie i debugowanie W podklasach klasy TestCase sprawdzaj powiązane ze sobą zachowanie Wybieraj testy integracyjne zamiast testów jednostkowych Izoluj testy od siebie za pomocą metod setUp(), tearDown(), setUpModule() i tearDownModule() Podczas testowania kodu zawierającego skomplikowane zależności korzystaj z imitacji Hermetyzuj zależności, aby ułatwić tworzenie imitacji i testowanie Używaj metody assertAlmostEqual() do kontrolowania precyzji w testach liczb zmiennoprzecinkowych Rozważ interaktywne usuwanie błędów za pomocą pdb Stosuj moduł tracemalloc, aby poznać sposób użycia pamięci i wykryć jej wycieki Współpraca Kiedy szukać modułów opracowanych przez społeczność? Używaj środowisk wirtualnych dla odizolowanych i powtarzalnych zależności Dla każdej funkcji, klasy i modułu utwórz docstring Używaj pakietów do organizacji modułów i dostarczania stabilnych API Rozważ użycie kodu o zasięgu modułu w celu konfiguracji środowiska wdrożenia Zdefiniuj główny wyjątek Exception w celu odizolowania komponentu wywołującego od API Zobacz, jak przerwać krąg zależności Rozważ użycie modułu warnings podczas refaktoryzacji i migracji kodu Rozważ stosowanie analizy statycznej za pomocą modułu typing w celu usuwania błędów Podczas tworzenia paczek programów w Pythonie wybieraj projekty otwartoźródłowe zamiast modułów zipimport i zipapp
Sygnatura czytelni BWEAiI: XII Ł 9
Media files:
Availability:
Biblioteka WEAiI
Copies are only available in the library: sygn. 157413 N (1 egz.)
Notes:
Tytuł oryginału: Effective Python : 125 specific ways to write better Python, 2025
General note
Wydanie 3. odnosi się do oryginału.
Na stronie 4. okładki także nazwa wydawcy oryginału: Pearson Addison-Wesley.
The item has been added to the basket. If you don't know what the basket is for, click here for details.
Do not show it again

Accessibility declaration