Dekoratory w Pythonie Wyja艣nione z Przyk艂adami

Co dekorator naprawd臋 robi z twoj膮 funkcj膮 Chcesz zmierzy膰 czas ka偶dej funkcji, kt贸ra wywo艂uje wolne zewn臋trzne API. Mo偶esz wklei膰 wywo艂ania time.perf_counter() do ka偶dej z nich albo napisa膰 pomiar raz i stosowa膰 go wsz臋dzie. Dekorator to druga opcja: to funkcja, kt贸ra bierze inn膮 funkcj臋, owija j膮 dodatkowym zachowaniem i zwraca owini臋t膮 wersj臋 pod oryginaln膮 nazw膮. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import time def timed(func): def wrapper(*args, **kwargs): start = time.perf_counter() result = func(*args, **kwargs) elapsed = time.perf_counter() - start print(f"{func.__name__} took {elapsed:.3f}s") return result return wrapper @timed def fetch_price(ticker): time.sleep(0.2) # zast臋puje wywo艂anie sieciowe return 142.50 fetch_price("AAPL") # fetch_price took 0.201s @timed nad def fetch_price to skr贸t od fetch_price = timed(fetch_price). Python wywo艂uje timed raz, zaraz po zdefiniowaniu fetch_price, i przypisuje nazw臋 fetch_price do tego, co zwraca timed. To jest ca艂a robota, jak膮 wykonuje @. ...

7 pa藕dziernika 2026 路 6 min 路 1185 s艂贸w 路 SpaghettiCoder

Czemu 0.1 + 0.2 Nie Daje 0.3: Liczby Zmiennoprzecinkowe

Wpisz 0.1 + 0.2 w shellu Pythona i nie dostaniesz 0.3. Dostaniesz 0.30000000000000004. Spr贸buj w JavaScript, Java, Go, C albo Rust i wyjdzie ten sam siedemnastocyfrowy ogon. Ka偶dy z tych j臋zyk贸w robi dok艂adnie to, co nakazuje standard sprz臋towy. Liczba, kt贸ra wymaga艂aby niesko艅czenie wielu cyfr binarnych, jest 艣ciskana do 64 bit贸w i co艣 musi ust膮pi膰. Czemu 0.1 nie da si臋 zapisa膰 dok艂adnie w binarnym systemie Komputery zapisuj膮 liczby zmiennoprzecinkowe w systemie dw贸jkowym. W systemie dw贸jkowym u艂amek 1/10 ma rozwini臋cie okresowe, tak jak 1/3 powtarza si臋 bez ko艅ca w systemie dziesi臋tnym (0.3333...). Zapisane w ca艂o艣ci, 0.1 w binarnym zaczyna si臋 tak: ...

6 pa藕dziernika 2026 路 5 min 路 1033 s艂贸w 路 SpaghettiCoder

Notacja Big O Wyja艣niona na Przyk艂adach Kodu

Odczyt ze s艂ownika w Pythonie trwa oko艂o 100 nanosekund, niezale偶nie od tego, czy s艂ownik ma 1000 kluczy, czy 1 000 000. Podw贸jna p臋tla szukaj膮ca duplikat贸w w li艣cie trwa p贸艂 milisekundy przy 200 elementach i 136 milisekund przy 3200. Szesna艣cie razy wi臋cej danych wej艣ciowych, prawie 280 razy d艂u偶sze oczekiwanie. Ta sama maszyna, ten sam Python. Notacja Big O to nazwa tej r贸偶nicy. Co mierzy notacja Big O Big O opisuje, jak ro艣nie czas dzia艂ania (albo zu偶ycie pami臋ci) fragmentu kodu wraz ze wzrostem danych wej艣ciowych. To nie jest pomiar stoperem i nie ma znaczenia, czy tw贸j laptop jest szybki, czy wolny. Liczy si臋 kszta艂t krzywej wzrostu: gdy podwoisz dane wej艣ciowe, czas si臋 podwaja, ro艣nie czterokrotnie, czy prawie si臋 nie zmienia? ...

4 pa藕dziernika 2026 路 8 min 路 1541 s艂贸w 路 SpaghettiCoder

Git Reset vs Revert vs Restore: Jak Cofn膮膰 Zmiany

Zrobisz git reset --hard na commicie, kt贸ry zesp贸艂 ju偶 pobra艂, i twoja historia zaczyna si臋 r贸偶ni膰 od jego historii. Zrobisz git revert na liter贸wce, kt贸rej jeszcze nie wypchn膮艂e艣, i dodajesz do logu bezsensowny commit. Git ma cztery polecenia do cofania zmian: restore, reset, commit --amend i revert. Nie s膮 wymienne. Wybierz niew艂a艣ciwe i albo nic si臋 nie stanie, albo stanie si臋 du偶o wi臋cej, ni偶 chcia艂e艣. O wyborze decyduje to, gdzie zmiana aktualnie si臋 znajduje: w working tree, w staging area, w commicie, kt贸ry masz tylko ty, czy w commicie, kt贸ry ju偶 wypchn膮艂e艣. ...

3 pa藕dziernika 2026 路 6 min 路 1223 s艂贸w 路 SpaghettiCoder

Czym Jest Dependency Injection? (Z Przyk艂adami)

Oto klasa, kt贸rej nie przetestujesz jednostkowo bez dzia艂aj膮cej bazy danych i serwera SMTP: 1 2 3 4 5 6 7 8 9 10 11 public class OrderService { private readonly SqlOrderRepository _repository = new SqlOrderRepository("Server=prod-db;Database=Orders;..."); private readonly SmtpEmailSender _emailSender = new SmtpEmailSender("smtp.company.com"); public void PlaceOrder(Order order) { _repository.Save(order); _emailSender.Send(order.CustomerEmail, "Order confirmed"); } } OrderService tworzy w艂asne instancje SqlOrderRepository i SmtpEmailSender przez new, razem z connection stringiem. Ka偶dy test dotykaj膮cy PlaceOrder potrzebuje prawdziwej bazy Orders i dzia艂aj膮cego serwera pocztowego, inaczej padnie, zanim dojdzie do asercji. Logika, kt贸r膮 chcesz przetestowa膰, to dwie linijki: zapisz zam贸wienie, wy艣lij potwierdzenie. Jest zespawana z dwiema konkretnymi klasami, kt贸rych nie da si臋 podmieni膰. ...

1 pa藕dziernika 2026 路 7 min 路 1384 s艂贸w 路 SpaghettiCoder

Testy Jednostkowe vs Integracyjne vs End-to-End

Funkcja mo偶e mie膰 100% pokrycia testami jednostkowymi, a strona, kt贸ra j膮 wywo艂uje, i tak mo偶e zwr贸ci膰 w produkcji b艂膮d 500. To nie jest sprzeczno艣膰. Testy jednostkowe, integracyjne i end-to-end sprawdzaj膮 r贸偶ne rzeczy, a zestaw test贸w mocny w jednym i s艂aby w drugim ma konkretn膮, przewidywaln膮 dziur臋. Co sprawdzaj膮 testy jednostkowe, integracyjne i end-to-end We藕my funkcj臋 rejestracji: funkcja waliduje dane wej艣ciowe, zapisuje wiersz w bazie danych i wysy艂a email powitalny. Trzy testy mog膮 to pokry膰, ka偶dy odpowiada na inne pytanie. ...

29 wrze艣nia 2026 路 10 min 路 2010 s艂贸w 路 SpaghettiCoder

Async/Await i Event Loop w JavaScript Wyja艣nione

Odpal to w Node albo w konsoli przegl膮darki: 1 2 3 4 console.log("1"); setTimeout(() => console.log("2"), 0); Promise.resolve().then(() => console.log("3")); console.log("4"); Wynik to 1 4 3 2. Callback promise wygrywa z setTimeout ustawionym na 0ms: wykonuje si臋 przed nim, cho膰 obu i tak przyjdzie zaczeka膰, a偶 zako艅czy si臋 ca艂y synchroniczny kod, kt贸ry jest jeszcze do wykonania poni偶ej. async/await jest zbudowane na tej kolejno艣ci, nie na czym艣 nowym. Wi臋kszo艣膰 zaskakuj膮cych zachowa艅 w asynchronicznym JavaScript wynika z traktowania await jak czego艣, co zatrzymuje ca艂y program, podczas gdy zatrzymuje tylko funkcj臋, w kt贸rej si臋 znajduje. ...

28 wrze艣nia 2026 路 8 min 路 1516 s艂贸w 路 SpaghettiCoder

Czym Jest CORS i Jak Naprawi膰 B艂臋dy CORS

Tw贸j frontend dzia艂a na http://localhost:5173, API na http://localhost:4000, a zapytanie fetch, kt贸re bez problemu dzia艂a艂o w Postmanie, w przegl膮darce ko艅czy si臋 艣cian膮 czerwonego tekstu: Access to fetch at 'http://localhost:4000/api/users' from origin 'http://localhost:5173' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Ca艂kiem mo偶liwe, 偶e tw贸j serwer obs艂u偶y艂 to zapytanie i zwr贸ci艂 200. Przegl膮darka po prostu odm贸wi艂a przekazania odpowiedzi do twojego JavaScriptu. Ta odmowa to same-origin policy. CORS to spos贸b, w jaki serwer m贸wi przegl膮darce, 偶eby z艂agodzi艂a t臋 zasad臋 dla konkretnych stron. Ka偶da poprawka poni偶ej sprowadza si臋 do jednego nag艂贸wka odpowiedzi, kt贸rego przegl膮darka nie dosta艂a. ...

26 wrze艣nia 2026 路 7 min 路 1428 s艂贸w 路 SpaghettiCoder

Jak Skonfigurowa膰 Debugowanie Zdalne w Visual Studio

Bug odtwarza si臋 na serwerze testowym, a nie na twoim laptopie. Serwer testowy nie ma Visual Studio, a instalowanie tam pe艂nego IDE, 偶eby ustawi膰 jeden breakpoint, nie wchodzi w gr臋. Debugowanie zdalne jest zrobione w艂a艣nie na taki przypadek. Ma艂y samodzielny program dzia艂a na maszynie docelowej, twoje lokalne Visual Studio 艂膮czy si臋 z nim przez sie膰, a ty dostajesz breakpointy i podgl膮d zmiennych na procesie, kt贸ry nie dzia艂a nigdzie w pobli偶u twojego biurka. ...

23 wrze艣nia 2026 路 6 min 路 1219 s艂贸w 路 SpaghettiCoder