{"id":1483,"date":"2026-04-04T13:19:19","date_gmt":"2026-04-04T11:19:19","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1483"},"modified":"2026-04-25T13:24:16","modified_gmt":"2026-04-25T11:24:16","slug":"isinstance-sprawdza-czy-obiekt-jest-instancja-okreslonego-typu","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/04\/04\/isinstance-sprawdza-czy-obiekt-jest-instancja-okreslonego-typu\/","title":{"rendered":"Isinstance \u2013 sprawdza, czy obiekt jest instancj\u0105 okre\u015blonego typu"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">W Pythonie kontrola typ\u00f3w pojawia si\u0119 szybciej, ni\u017c zwykle zak\u0142ada pocz\u0105tkuj\u0105cy programista. Wystarczy kilka funkcji przyjmuj\u0105cych r\u00f3\u017cne dane wej\u015bciowe, odczyt z pliku, dane z API albo formularz u\u017cytkownika i nagle okazuje si\u0119, \u017ce program przestaje dzia\u0142a\u0107 nie przez skomplikowany algorytm, ale przez zwyk\u0142y z\u0142y typ zmiennej. Dynamiczne typowanie daje wygod\u0119, ale wymaga \u015bwiadomej kontroli miejsc, w kt\u00f3rych dane mog\u0105 mie\u0107 r\u00f3\u017cn\u0105 struktur\u0119. W codziennej pracy z dynamicznym typowaniem szczeg\u00f3lnie wa\u017cne staje si\u0119 Isinstance.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis Tre\u015bci<\/h2><nav><ol><li><a href=\"#isinstance-sprawdza-czy-obiekt-jest-instancja-okreslonego-typu-i-pozwala-bezpiecznie-kontrolowac-dane-wejsciowe-w-kodzie-produkcyjnym\">Isinstance \u2013 sprawdza, czy obiekt jest instancj\u0105 okre\u015blonego typu i pozwala bezpiecznie kontrolowa\u0107 dane wej\u015bciowe w kodzie produkcyjnym<\/a><ol><li><a href=\"#dlaczego-samo-type-czesto-nie-wystarcza\">Dlaczego samo type() cz\u0119sto nie wystarcza<\/a><\/li><\/ol><\/li><li><a href=\"#isinstance-sprawdza-czy-obiekt-jest-instancja-okreslonego-typu-takze-wtedy-gdy-dziala-mechanizm-dziedziczenia-klas\">Isinstance \u2013 sprawdza, czy obiekt jest instancj\u0105 okre\u015blonego typu tak\u017ce wtedy, gdy dzia\u0142a mechanizm dziedziczenia klas<\/a><ol><li><a href=\"#praktyczny-przyklad-z-systemem-platnosci\">Praktyczny przyk\u0142ad z systemem p\u0142atno\u015bci<\/a><\/li><\/ol><\/li><li><a href=\"#isinstance-sprawdza-czy-obiekt-jest-instancja-okreslonego-typu-rowniez-dla-wielu-typow-jednoczesnie-i-struktur-mieszanych\">Isinstance \u2013 sprawdza, czy obiekt jest instancj\u0105 okre\u015blonego typu r\u00f3wnie\u017c dla wielu typ\u00f3w jednocze\u015bnie i struktur mieszanych<\/a><ol><li><a href=\"#wazny-szczegol-dotyczacy-bool-i-int\">Wa\u017cny szczeg\u00f3\u0142 dotycz\u0105cy bool i int<\/a><\/li><li><a href=\"#praca-z-listami-i-kolekcjami\">Praca z listami i kolekcjami<\/a><\/li><\/ol><\/li><li><a href=\"#typowe-pulapki-i-bledy-ktore-regularnie-pojawiaja-sie-w-codziennej-pracy\">Typowe pu\u0142apki i b\u0142\u0119dy, kt\u00f3re regularnie pojawiaj\u0105 si\u0119 w codziennej pracy<\/a><ol><li><a href=\"#naduzywanie-sprawdzania-typu-zamiast-projektowania-interfejsu\">Nadu\u017cywanie sprawdzania typu zamiast projektowania interfejsu<\/a><\/li><li><a href=\"#mylenie-isinstance-z-issubclass\">Mylenie isinstance() z issubclass()<\/a><\/li><li><a href=\"#zakladanie-ze-dane-z-api-maja-wlasciwy-typ\">Zak\u0142adanie, \u017ce dane z API maj\u0105 w\u0142a\u015bciwy typ<\/a><\/li><\/ol><\/li><li><a href=\"#krotkie-uwagi-praktyczne-z-perspektywy-utrzymania-kodu\">Kr\u00f3tkie uwagi praktyczne z perspektywy utrzymania kodu<\/a><\/li><li><a href=\"#faq\">FAQ<\/a><ol><li><a href=\"#czy-isinstance-dziala-tylko-dla-typow-wbudowanych\">Czy isinstance() dzia\u0142a tylko dla typ\u00f3w wbudowanych?<\/a><\/li><li><a href=\"#czy-mozna-sprawdzic-kilka-typow-jednoczesnie\">Czy mo\u017cna sprawdzi\u0107 kilka typ\u00f3w jednocze\u015bnie?<\/a><\/li><li><a href=\"#czy-isinstance-jest-lepsze-od-type\">Czy isinstance() jest lepsze od type()?<\/a><\/li><li><a href=\"#dlaczego-true-jest-traktowane-jak-int\">Dlaczego True jest traktowane jak int?<\/a><\/li><li><a href=\"#czy-isinstance-spowalnia-program\">Czy isinstance() spowalnia program?<\/a><\/li><li><a href=\"#czy-warto-uzywac-isinstance-w-kazdej-funkcji\">Czy warto u\u017cywa\u0107 isinstance() w ka\u017cdej funkcji?<\/a><\/li><\/ol><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"isinstance-sprawdza-czy-obiekt-jest-instancja-okreslonego-typu-i-pozwala-bezpiecznie-kontrolowac-dane-wejsciowe-w-kodzie-produkcyjnym\">Isinstance \u2013 sprawdza, czy obiekt jest instancj\u0105 okre\u015blonego typu i pozwala bezpiecznie kontrolowa\u0107 dane wej\u015bciowe w kodzie produkcyjnym<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Funkcja <code>isinstance()<\/code> nale\u017cy do podstawowych narz\u0119dzi wbudowanych w Pythonie. Jej zadanie jest proste: sprawdza, czy wskazany obiekt nale\u017cy do okre\u015blonego typu lub klasy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sk\u0142adnia wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Element<\/th><th>Zapis<\/th><\/tr><\/thead><tbody><tr><td>Podstawowa sk\u0142adnia<\/td><td><code>isinstance(obiekt, typ)<\/code><\/td><\/tr><tr><td>Sprawdzenie wielu typ\u00f3w<\/td><td><code>isinstance(obiekt, (int, float, str))<\/code><\/td><\/tr><tr><td>Wynik<\/td><td><code>True<\/code> albo <code>False<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Zwracana warto\u015b\u0107 to zawsze typ logiczny.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Najwa\u017cniejsze jest to, \u017ce funkcja nie por\u00f3wnuje tylko \u201enazwy typu\u201d, ale bierze pod uwag\u0119 r\u00f3wnie\u017c dziedziczenie klas. To odr\u00f3\u017cnia j\u0105 od prostego por\u00f3wnania z u\u017cyciem <code>type()<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad podstawowy:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>python\\nx = 10\\nprint(isinstance(x, int))\\n<\/code><\/td><\/tr><tr><td>C++ (odpowiednik idei przez RTTI)<\/td><td><code>cpp\\n#include &lt;iostream&gt;\\nusing namespace std;\\n\\nclass Base {};\\nclass Derived : public Base {};\\n\\nint main() {\\n Base* obj = new Derived();\\n if(dynamic_cast&lt;Derived*&gt;(obj)) {\\n cout &lt;&lt; \\\"Tak\\\";\\n }\\n}\\n<\/code><\/td><\/tr><tr><td>C (manualna kontrola typu)<\/td><td><code>c\\n#include &lt;stdio.h&gt;\\n\\nint main() {\\n int x = 10;\\n printf(\\\"int\\\\n\\\");\\n return 0;\\n}\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">W C nie ma wbudowanego mechanizmu refleksji typ\u00f3w jak w Pythonie, dlatego kontrola typu jest zwykle r\u0119czna. W C++ rol\u0119 zbli\u017con\u0105 pe\u0142ni <code>dynamic_cast<\/code>, ale dzia\u0142a inaczej i g\u0142\u00f3wnie dla klas polimorficznych.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Typowy przypadek u\u017cycia w Pythonie to walidacja argument\u00f3w funkcji:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>python\\ndef dodaj_vat(cena):\\n if not isinstance(cena, (int, float)):\\n return \\\"B\u0142\u0119dny typ danych\\\"\\n return cena * 1.23\\n\\nprint(dodaj_vat(100))\\nprint(dodaj_vat(\\\"100\\\"))\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Bez tego sprawdzenia program mo\u017ce zako\u0144czy\u0107 si\u0119 wyj\u0105tkiem lub &#8211; co gorsza &#8211; wykona\u0107 b\u0142\u0119dne obliczenia bez widocznego b\u0142\u0119du.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W praktyce to drugie jest gro\u017aniejsze. Awaria jest widoczna. Z\u0142y wynik finansowy zapisany w bazie ju\u017c nie.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-samo-type-czesto-nie-wystarcza\">Dlaczego samo type() cz\u0119sto nie wystarcza<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wiele os\u00f3b zaczyna od takiego zapisu:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td><code>python\\nif type(x) == int:\\n print(\\\"liczba ca\u0142kowita\\\")\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Technicznie dzia\u0142a, ale ma istotne ograniczenie: nie uwzgl\u0119dnia dziedziczenia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi klasa potomna rozszerza klas\u0119 bazow\u0105, <code>type()<\/code> uzna je za r\u00f3\u017cne typy, nawet je\u015bli logicznie obiekt powinien by\u0107 akceptowany.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>isinstance()<\/code> dzia\u0142a szerzej i zwykle bezpieczniej.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To szczeg\u00f3lnie wa\u017cne w wi\u0119kszych projektach, bibliotekach i systemach, gdzie klasy s\u0105 rozwijane przez wiele miesi\u0119cy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"isinstance-sprawdza-czy-obiekt-jest-instancja-okreslonego-typu-takze-wtedy-gdy-dziala-mechanizm-dziedziczenia-klas\">Isinstance \u2013 sprawdza, czy obiekt jest instancj\u0105 okre\u015blonego typu tak\u017ce wtedy, gdy dzia\u0142a mechanizm dziedziczenia klas<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To miejsce, w kt\u00f3rym r\u00f3\u017cnica mi\u0119dzy <code>type()<\/code> a <code>isinstance()<\/code> staje si\u0119 naprawd\u0119 istotna.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Za\u0142\u00f3\u017cmy prost\u0105 hierarchi\u0119:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Python<\/td><td><code>python\\nclass Zwierze:\\n pass\\n\\nclass Pies(Zwierze):\\n pass\\n\\nobj = Pies()\\n\\nprint(isinstance(obj, Zwierze))\\nprint(type(obj) == Zwierze)\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Wynik:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>isinstance(obj, Zwierze)<\/code> \u2192 <code>True<\/code><\/li>\n\n\n\n<li><code>type(obj) == Zwierze<\/code> \u2192 <code>False<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">To poprawne zachowanie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Obiekt <code>Pies<\/code> faktycznie jest specjalnym przypadkiem klasy <code>Zwierze<\/code>, wi\u0119c kod biznesowy powinien zwykle go akceptowa\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Gdy programista u\u017cywa <code>type()<\/code>, cz\u0119sto przypadkowo blokuje klasy potomne i p\u00f3\u017aniej pojawiaj\u0105 si\u0119 trudne do znalezienia b\u0142\u0119dy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>system nie akceptuje poprawnych danych,<\/li>\n\n\n\n<li>API odrzuca obiekty,<\/li>\n\n\n\n<li>testy przechodz\u0105 lokalnie, ale nie w \u015brodowisku produkcyjnym.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">W projektach opartych o OOP to bardzo cz\u0119sty problem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"praktyczny-przyklad-z-systemem-platnosci\">Praktyczny przyk\u0142ad z systemem p\u0142atno\u015bci<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wyobra\u017amy sobie klas\u0119 bazow\u0105:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td><code>python\\nclass Platnosc:\\n def wykonaj(self):\\n pass\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">oraz klasy potomne:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td><code>python\\nclass Karta(Platnosc):\\n pass\\n\\nclass BLIK(Platnosc):\\n pass\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Walidacja:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td><code>python\\ndef obsluz(p):\\n if isinstance(p, Platnosc):\\n print(\\\"P\u0142atno\u015b\u0107 zaakceptowana\\\")\\n else:\\n print(\\\"Niepoprawny obiekt\\\")\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Takie podej\u015bcie pozwala rozwija\u0107 system bez ci\u0105g\u0142ego przepisywania warunk\u00f3w.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli za p\u00f3\u0142 roku pojawi si\u0119 nowa metoda p\u0142atno\u015bci, kod nadal b\u0119dzie poprawny.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To oszcz\u0119dza czas i zmniejsza liczb\u0119 regresji.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"isinstance-sprawdza-czy-obiekt-jest-instancja-okreslonego-typu-rowniez-dla-wielu-typow-jednoczesnie-i-struktur-mieszanych\">Isinstance \u2013 sprawdza, czy obiekt jest instancj\u0105 okre\u015blonego typu r\u00f3wnie\u017c dla wielu typ\u00f3w jednocze\u015bnie i struktur mieszanych<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bardzo praktyczna mo\u017cliwo\u015b\u0107 to sprawdzanie kilku typ\u00f3w naraz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zamiast pisa\u0107:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td><code>python\\nif isinstance(x, int) or isinstance(x, float):\\n print(\\\"liczba\\\")\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">lepiej u\u017cy\u0107:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td><code>python\\nif isinstance(x, (int, float)):\\n print(\\\"liczba\\\")\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Drugi argument mo\u017ce by\u0107 krotk\u0105 typ\u00f3w.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To rozwi\u0105zanie jest czytelniejsze, kr\u00f3tsze i \u0142atwiejsze w utrzymaniu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"wazny-szczegol-dotyczacy-bool-i-int\">Wa\u017cny szczeg\u00f3\u0142 dotycz\u0105cy bool i int<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">W Pythonie:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td><code>python\\nprint(isinstance(True, int))\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">wynik to:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>True<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dla wielu os\u00f3b jest to zaskoczenie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dlaczego tak si\u0119 dzieje?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poniewa\u017c <code>bool<\/code> dziedziczy po <code>int<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Formalnie:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td><code>python\\nprint(issubclass(bool, int))\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">zwraca:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>True<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To historyczna decyzja projektowa j\u0119zyka.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W praktyce oznacza to, \u017ce walidacja typu liczbowego mo\u017ce przypadkowo przepu\u015bci\u0107 warto\u015bci logiczne.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli to problem, trzeba sprawdza\u0107 dok\u0142adniej:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td><code>python\\nif isinstance(x, int) and not isinstance(x, bool):\\n print(\\\"prawdziwa liczba ca\u0142kowita\\\")\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Przy systemach ksi\u0119gowych, raportach lub analizie danych ten detal ma realne znaczenie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">B\u0142\u0105d typu <code>True + 100 = 101<\/code> potrafi przej\u015b\u0107 niezauwa\u017cony.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"praca-z-listami-i-kolekcjami\">Praca z listami i kolekcjami<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cz\u0119sto sprawdzamy nie tylko pojedyncze warto\u015bci, ale ca\u0142e struktury:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td><code>python\\ndane = [1, 2, 3]\\n\\nif isinstance(dane, list):\\n print(\\\"to lista\\\")\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Trzeba jednak pami\u0119ta\u0107, \u017ce to sprawdza typ kontenera, a nie typ jego element\u00f3w.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u015bli chcemy walidowa\u0107 zawarto\u015b\u0107:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td><code>python\\nif all(isinstance(x, int) for x in dane):\\n print(\\\"same liczby ca\u0142kowite\\\")\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To wa\u017cne np. przy danych z JSON, CSV albo formularzy webowych.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"typowe-pulapki-i-bledy-ktore-regularnie-pojawiaja-sie-w-codziennej-pracy\">Typowe pu\u0142apki i b\u0142\u0119dy, kt\u00f3re regularnie pojawiaj\u0105 si\u0119 w codziennej pracy<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"naduzywanie-sprawdzania-typu-zamiast-projektowania-interfejsu\">Nadu\u017cywanie sprawdzania typu zamiast projektowania interfejsu<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie ka\u017cdy problem nale\u017cy rozwi\u0105zywa\u0107 przez <code>isinstance()<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Czasem lepiej sprawdzi\u0107, czy obiekt posiada potrzebn\u0105 metod\u0119, zamiast pyta\u0107 o jego typ.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To podej\u015bcie nazywa si\u0119 duck typing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td><code>python\\nif hasattr(obj, \\\"zapisz\\\"):\\n obj.zapisz()\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Zasada jest prosta:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">je\u015bli obiekt zachowuje si\u0119 poprawnie, jego dok\u0142adny typ mo\u017ce by\u0107 mniej istotny.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zbyt agresywne sprawdzanie typ\u00f3w cz\u0119sto prowadzi do sztywnego kodu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"mylenie-isinstance-z-issubclass\">Mylenie isinstance() z issubclass()<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To dwa r\u00f3\u017cne narz\u0119dzia:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Funkcja<\/th><th>Sprawdza<\/th><\/tr><\/thead><tbody><tr><td><code>isinstance()<\/code><\/td><td>obiekt<\/td><\/tr><tr><td><code>issubclass()<\/code><\/td><td>klas\u0119<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td><code>python\\nissubclass(bool, int)\\nisinstance(True, int)\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Oba mog\u0105 zwr\u00f3ci\u0107 <code>True<\/code>, ale odpowiadaj\u0105 na inne pytania.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"zakladanie-ze-dane-z-api-maja-wlasciwy-typ\">Zak\u0142adanie, \u017ce dane z API maj\u0105 w\u0142a\u015bciwy typ<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To cz\u0119sty b\u0142\u0105d.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">JSON nie gwarantuje jako\u015bci danych. Pole liczbowe mo\u017ce nagle sta\u0107 si\u0119 tekstem albo <code>null<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Walidacja typu powinna by\u0107 \u015bwiadoma, szczeg\u00f3lnie:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>w integracjach z zewn\u0119trznymi systemami,<\/li>\n\n\n\n<li>przy imporcie danych,<\/li>\n\n\n\n<li>w automatycznych raportach,<\/li>\n\n\n\n<li>w kodzie finansowym i administracyjnym.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Tu b\u0142\u0119dy kosztuj\u0105 nie tylko czas, ale cz\u0119sto pieni\u0105dze.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"krotkie-uwagi-praktyczne-z-perspektywy-utrzymania-kodu\">Kr\u00f3tkie uwagi praktyczne z perspektywy utrzymania kodu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi warunki typu pojawiaj\u0105 si\u0119 w wielu miejscach, warto przenie\u015b\u0107 je do jednej funkcji pomocniczej.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Kod<\/th><\/tr><\/thead><tbody><tr><td><code>python\\ndef poprawna_kwota(x):\\n return isinstance(x, (int, float)) and not isinstance(x, bool)\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dzi\u0119ki temu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>logika jest sp\u00f3jna,<\/li>\n\n\n\n<li>\u0142atwiej zmieni\u0107 regu\u0142\u0119,<\/li>\n\n\n\n<li>testy s\u0105 prostsze.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Druga rzecz: nie sprawdza\u0107 typu \u201ena zapas\u201d.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Walidacja powinna pojawia\u0107 si\u0119 tam, gdzie naprawd\u0119 istnieje ryzyko b\u0142\u0119du, a nie wsz\u0119dzie bez wyj\u0105tku.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nadmierna kontrola typu potrafi zamieni\u0107 prosty kod w trudny do utrzymania system warunk\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-isinstance-dziala-tylko-dla-typow-wbudowanych\">Czy isinstance() dzia\u0142a tylko dla typ\u00f3w wbudowanych?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie. Dzia\u0142a r\u00f3wnie\u017c dla w\u0142asnych klas, klas dziedzicz\u0105cych oraz obiekt\u00f3w pochodz\u0105cych z bibliotek zewn\u0119trznych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-mozna-sprawdzic-kilka-typow-jednoczesnie\">Czy mo\u017cna sprawdzi\u0107 kilka typ\u00f3w jednocze\u015bnie?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Tak. Drugi argument mo\u017ce by\u0107 krotk\u0105 typ\u00f3w, na przyk\u0142ad <code>(int, float, str)<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-isinstance-jest-lepsze-od-type\">Czy isinstance() jest lepsze od type()?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">W wi\u0119kszo\u015bci przypadk\u00f3w tak, poniewa\u017c uwzgl\u0119dnia dziedziczenie. <code>type()<\/code> ma sens wtedy, gdy potrzebne jest sprawdzenie dok\u0142adnie jednego konkretnego typu bez klas potomnych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-true-jest-traktowane-jak-int\">Dlaczego True jest traktowane jak int?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Poniewa\u017c <code>bool<\/code> dziedziczy po <code>int<\/code>. To cecha j\u0119zyka Python, a nie b\u0142\u0105d programu.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-isinstance-spowalnia-program\">Czy isinstance() spowalnia program?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Koszt jest bardzo ma\u0142y i w typowych zastosowaniach praktycznie pomijalny. Znacznie wi\u0119kszym problemem s\u0105 b\u0142\u0119dy wynikaj\u0105ce z braku walidacji.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-warto-uzywac-isinstance-w-kazdej-funkcji\">Czy warto u\u017cywa\u0107 isinstance() w ka\u017cdej funkcji?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nie. Najlepiej stosowa\u0107 je tam, gdzie dane pochodz\u0105 z niepewnego \u017ar\u00f3d\u0142a albo gdzie b\u0142\u0119dny typ mo\u017ce wywo\u0142a\u0107 kosztown\u0105 awari\u0119.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dobrze u\u017cyte <code>isinstance()<\/code> nie jest dodatkiem kosmetycznym, ale elementem bezpiecze\u0144stwa programu. Szczeg\u00f3lnie w Pythonie, gdzie elastyczno\u015b\u0107 typ\u00f3w jest zalet\u0105 i jednocze\u015bnie \u017ar\u00f3d\u0142em wielu subtelnych b\u0142\u0119d\u00f3w, \u015bwiadoma kontrola typu pozwala unikn\u0105\u0107 problem\u00f3w, kt\u00f3re zwykle wychodz\u0105 dopiero na produkcji.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>\u0179r\u00f3d\u0142o Foto: Freepik<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W Pythonie kontrola typ\u00f3w pojawia si\u0119 szybciej, ni\u017c zwykle zak\u0142ada pocz\u0105tkuj\u0105cy programista. Wystarczy kilka funkcji przyjmuj\u0105cych r\u00f3\u017cne dane wej\u015bciowe, odczyt z pliku, dane z API albo formularz u\u017cytkownika i nagle okazuje si\u0119, \u017ce program przestaje dzia\u0142a\u0107 nie przez skomplikowany algorytm, ale przez zwyk\u0142y z\u0142y typ zmiennej. Dynamiczne typowanie daje wygod\u0119, ale wymaga \u015bwiadomej kontroli miejsc, w kt\u00f3rych dane mog\u0105 mie\u0107 r\u00f3\u017cn\u0105 struktur\u0119. W codziennej pracy z dynamicznym typowaniem szczeg\u00f3lnie wa\u017cne staje si\u0119 Isinstance. Isinstance \u2013 sprawdza, czy obiekt jest instancj\u0105 okre\u015blonego typu i pozwala bezpiecznie kontrolowa\u0107 dane wej\u015bciowe w kodzie produkcyjnym Funkcja isinstance() nale\u017cy do podstawowych narz\u0119dzi wbudowanych w Pythonie. Jej zadanie jest proste: sprawdza, czy wskazany obiekt nale\u017cy do okre\u015blonego typu lub klasy. Sk\u0142adnia wygl\u0105da nast\u0119puj\u0105co: Element Zapis Podstawowa sk\u0142adnia isinstance(obiekt, typ) Sprawdzenie wielu typ\u00f3w isinstance(obiekt, (int, float, str)) Wynik True albo False Zwracana warto\u015b\u0107 to zawsze typ logiczny. Najwa\u017cniejsze jest to, \u017ce funkcja nie por\u00f3wnuje tylko \u201enazwy typu\u201d, ale bierze pod uwag\u0119 r\u00f3wnie\u017c dziedziczenie klas. To odr\u00f3\u017cnia j\u0105 od prostego por\u00f3wnania z u\u017cyciem type(). Przyk\u0142ad podstawowy: J\u0119zyk Kod Python python\\nx = 10\\nprint(isinstance(x, int))\\n C++ (odpowiednik idei przez RTTI) cpp\\n#include &lt;iostream&gt;\\nusing namespace std;\\n\\nclass Base {};\\nclass Derived : public Base {};\\n\\nint main() {\\n Base* obj = new Derived();\\n if(dynamic_cast&lt;Derived*&gt;(obj)) {\\n cout &lt;&lt; \\&#8221;Tak\\&#8221;;\\n }\\n}\\n C (manualna kontrola typu) c\\n#include &lt;stdio.h&gt;\\n\\nint main() {\\n int x = 10;\\n printf(\\&#8221;int\\\\n\\&#8221;);\\n return 0;\\n}\\n W C nie ma wbudowanego mechanizmu refleksji typ\u00f3w jak w Pythonie, dlatego kontrola typu jest zwykle r\u0119czna. W C++ rol\u0119 zbli\u017con\u0105 pe\u0142ni dynamic_cast, ale dzia\u0142a inaczej i g\u0142\u00f3wnie dla klas polimorficznych. Typowy przypadek u\u017cycia w Pythonie to walidacja argument\u00f3w funkcji: J\u0119zyk Kod Python python\\ndef dodaj_vat(cena):\\n if not isinstance(cena, (int, float)):\\n return \\&#8221;B\u0142\u0119dny typ danych\\&#8221;\\n return cena * 1.23\\n\\nprint(dodaj_vat(100))\\nprint(dodaj_vat(\\&#8221;100\\&#8221;))\\n Bez tego sprawdzenia program mo\u017ce zako\u0144czy\u0107 si\u0119 wyj\u0105tkiem lub &#8211; co gorsza &#8211; wykona\u0107 b\u0142\u0119dne obliczenia bez widocznego b\u0142\u0119du. W praktyce to drugie jest gro\u017aniejsze. Awaria jest widoczna. Z\u0142y wynik finansowy zapisany w bazie ju\u017c nie. Dlaczego samo type() cz\u0119sto nie wystarcza Wiele os\u00f3b zaczyna od takiego zapisu: Kod python\\nif type(x) == int:\\n print(\\&#8221;liczba ca\u0142kowita\\&#8221;)\\n Technicznie dzia\u0142a, ale ma istotne ograniczenie: nie uwzgl\u0119dnia dziedziczenia. Je\u017celi klasa potomna rozszerza klas\u0119 bazow\u0105, type() uzna je za r\u00f3\u017cne typy, nawet je\u015bli logicznie obiekt powinien by\u0107 akceptowany. isinstance() dzia\u0142a szerzej i zwykle bezpieczniej. To szczeg\u00f3lnie wa\u017cne w wi\u0119kszych projektach, bibliotekach i systemach, gdzie klasy s\u0105 rozwijane przez wiele miesi\u0119cy. Isinstance \u2013 sprawdza, czy obiekt jest instancj\u0105 okre\u015blonego typu tak\u017ce wtedy, gdy dzia\u0142a mechanizm dziedziczenia klas To miejsce, w kt\u00f3rym r\u00f3\u017cnica mi\u0119dzy type() a isinstance() staje si\u0119 naprawd\u0119 istotna. Za\u0142\u00f3\u017cmy prost\u0105 hierarchi\u0119: J\u0119zyk Kod Python python\\nclass Zwierze:\\n pass\\n\\nclass Pies(Zwierze):\\n pass\\n\\nobj = Pies()\\n\\nprint(isinstance(obj, Zwierze))\\nprint(type(obj) == Zwierze)\\n Wynik: To poprawne zachowanie. Obiekt Pies faktycznie jest specjalnym przypadkiem klasy Zwierze, wi\u0119c kod biznesowy powinien zwykle go akceptowa\u0107. Gdy programista u\u017cywa type(), cz\u0119sto przypadkowo blokuje klasy potomne i p\u00f3\u017aniej pojawiaj\u0105 si\u0119 trudne do znalezienia b\u0142\u0119dy: W projektach opartych o OOP to bardzo cz\u0119sty problem. Praktyczny przyk\u0142ad z systemem p\u0142atno\u015bci Wyobra\u017amy sobie klas\u0119 bazow\u0105: Kod python\\nclass Platnosc:\\n def wykonaj(self):\\n pass\\n oraz klasy potomne: Kod python\\nclass Karta(Platnosc):\\n pass\\n\\nclass BLIK(Platnosc):\\n pass\\n Walidacja: Kod python\\ndef obsluz(p):\\n if isinstance(p, Platnosc):\\n print(\\&#8221;P\u0142atno\u015b\u0107 zaakceptowana\\&#8221;)\\n else:\\n print(\\&#8221;Niepoprawny obiekt\\&#8221;)\\n Takie podej\u015bcie pozwala rozwija\u0107 system bez ci\u0105g\u0142ego przepisywania warunk\u00f3w. Je\u015bli za p\u00f3\u0142 roku pojawi si\u0119 nowa metoda p\u0142atno\u015bci, kod nadal b\u0119dzie poprawny. To oszcz\u0119dza czas i zmniejsza liczb\u0119 regresji. Isinstance \u2013 sprawdza, czy obiekt jest instancj\u0105 okre\u015blonego typu r\u00f3wnie\u017c dla wielu typ\u00f3w jednocze\u015bnie i struktur mieszanych Bardzo praktyczna mo\u017cliwo\u015b\u0107 to sprawdzanie kilku typ\u00f3w naraz. Zamiast pisa\u0107: Kod python\\nif isinstance(x, int) or isinstance(x, float):\\n print(\\&#8221;liczba\\&#8221;)\\n lepiej u\u017cy\u0107: Kod python\\nif isinstance(x, (int, float)):\\n print(\\&#8221;liczba\\&#8221;)\\n Drugi argument mo\u017ce by\u0107 krotk\u0105 typ\u00f3w. To rozwi\u0105zanie jest czytelniejsze, kr\u00f3tsze i \u0142atwiejsze w utrzymaniu. Wa\u017cny szczeg\u00f3\u0142 dotycz\u0105cy bool i int W Pythonie: Kod python\\nprint(isinstance(True, int))\\n wynik to: True Dla wielu os\u00f3b jest to zaskoczenie. Dlaczego tak si\u0119 dzieje? Poniewa\u017c bool dziedziczy po int. Formalnie: Kod python\\nprint(issubclass(bool, int))\\n zwraca: True To historyczna decyzja projektowa j\u0119zyka. W praktyce oznacza to, \u017ce walidacja typu liczbowego mo\u017ce przypadkowo przepu\u015bci\u0107 warto\u015bci logiczne. Je\u015bli to problem, trzeba sprawdza\u0107 dok\u0142adniej: Kod python\\nif isinstance(x, int) and not isinstance(x, bool):\\n print(\\&#8221;prawdziwa liczba ca\u0142kowita\\&#8221;)\\n Przy systemach ksi\u0119gowych, raportach lub analizie danych ten detal ma realne znaczenie. B\u0142\u0105d typu True + 100 = 101 potrafi przej\u015b\u0107 niezauwa\u017cony. Praca z listami i kolekcjami Cz\u0119sto sprawdzamy nie tylko pojedyncze warto\u015bci, ale ca\u0142e struktury: Kod python\\ndane = [1, 2, 3]\\n\\nif isinstance(dane, list):\\n print(\\&#8221;to lista\\&#8221;)\\n Trzeba jednak pami\u0119ta\u0107, \u017ce to sprawdza typ kontenera, a nie typ jego element\u00f3w. Je\u015bli chcemy walidowa\u0107 zawarto\u015b\u0107: Kod python\\nif all(isinstance(x, int) for x in dane):\\n print(\\&#8221;same liczby ca\u0142kowite\\&#8221;)\\n To wa\u017cne np. przy danych z JSON, CSV albo formularzy webowych. Typowe pu\u0142apki i b\u0142\u0119dy, kt\u00f3re regularnie pojawiaj\u0105 si\u0119 w codziennej pracy Nadu\u017cywanie sprawdzania typu zamiast projektowania interfejsu Nie ka\u017cdy problem nale\u017cy rozwi\u0105zywa\u0107 przez isinstance(). Czasem lepiej sprawdzi\u0107, czy obiekt posiada potrzebn\u0105 metod\u0119, zamiast pyta\u0107 o jego typ. To podej\u015bcie nazywa si\u0119 duck typing. Przyk\u0142ad: Kod python\\nif hasattr(obj, \\&#8221;zapisz\\&#8221;):\\n obj.zapisz()\\n Zasada jest prosta: je\u015bli obiekt zachowuje si\u0119 poprawnie, jego dok\u0142adny typ mo\u017ce by\u0107 mniej istotny. Zbyt agresywne sprawdzanie typ\u00f3w cz\u0119sto prowadzi do sztywnego kodu. Mylenie isinstance() z issubclass() To dwa r\u00f3\u017cne narz\u0119dzia: Funkcja Sprawdza isinstance() obiekt issubclass() klas\u0119 Przyk\u0142ad: Kod python\\nissubclass(bool, int)\\nisinstance(True, int)\\n Oba mog\u0105 zwr\u00f3ci\u0107 True, ale odpowiadaj\u0105 na inne pytania. Zak\u0142adanie, \u017ce dane z API maj\u0105 w\u0142a\u015bciwy typ To cz\u0119sty b\u0142\u0105d. JSON nie gwarantuje jako\u015bci danych. Pole liczbowe mo\u017ce nagle sta\u0107 si\u0119 tekstem albo null. Walidacja typu powinna by\u0107 \u015bwiadoma, szczeg\u00f3lnie: Tu b\u0142\u0119dy kosztuj\u0105 nie tylko czas, ale cz\u0119sto pieni\u0105dze. Kr\u00f3tkie uwagi praktyczne z perspektywy utrzymania kodu Je\u017celi warunki typu pojawiaj\u0105 si\u0119 w wielu miejscach, warto przenie\u015b\u0107 je do jednej funkcji pomocniczej. Przyk\u0142ad: Kod python\\ndef poprawna_kwota(x):\\n return isinstance(x, (int, float)) and not isinstance(x, bool)\\n Dzi\u0119ki temu: Druga rzecz: nie sprawdza\u0107 typu \u201ena zapas\u201d. Walidacja powinna pojawia\u0107 si\u0119 tam, gdzie naprawd\u0119 istnieje ryzyko b\u0142\u0119du, a nie wsz\u0119dzie bez wyj\u0105tku. Nadmierna kontrola typu potrafi zamieni\u0107 prosty kod w trudny do utrzymania system warunk\u00f3w. FAQ Czy isinstance() dzia\u0142a tylko dla typ\u00f3w wbudowanych? Nie. Dzia\u0142a r\u00f3wnie\u017c dla w\u0142asnych klas, klas dziedzicz\u0105cych oraz obiekt\u00f3w pochodz\u0105cych z bibliotek zewn\u0119trznych. Czy mo\u017cna sprawdzi\u0107 kilka typ\u00f3w jednocze\u015bnie? Tak. Drugi argument mo\u017ce by\u0107 krotk\u0105 typ\u00f3w, na przyk\u0142ad (int, float, str). Czy isinstance() jest lepsze od type()? W wi\u0119kszo\u015bci przypadk\u00f3w tak, poniewa\u017c uwzgl\u0119dnia dziedziczenie. type() ma sens wtedy, gdy potrzebne jest sprawdzenie dok\u0142adnie jednego konkretnego typu bez klas potomnych. Dlaczego True jest traktowane jak int? Poniewa\u017c bool dziedziczy po int. To cecha j\u0119zyka Python, a nie b\u0142\u0105d programu. Czy isinstance() spowalnia program? Koszt jest bardzo ma\u0142y i w typowych zastosowaniach praktycznie pomijalny. Znacznie wi\u0119kszym problemem s\u0105 b\u0142\u0119dy wynikaj\u0105ce z braku walidacji. Czy warto u\u017cywa\u0107 isinstance() w ka\u017cdej funkcji? Nie. Najlepiej stosowa\u0107 je tam, gdzie dane pochodz\u0105 z niepewnego \u017ar\u00f3d\u0142a albo gdzie b\u0142\u0119dny typ mo\u017ce wywo\u0142a\u0107 kosztown\u0105 awari\u0119. Dobrze u\u017cyte isinstance() nie jest dodatkiem kosmetycznym, ale elementem bezpiecze\u0144stwa programu. Szczeg\u00f3lnie w Pythonie, gdzie elastyczno\u015b\u0107 typ\u00f3w jest zalet\u0105 i jednocze\u015bnie \u017ar\u00f3d\u0142em wielu subtelnych b\u0142\u0119d\u00f3w, \u015bwiadoma kontrola typu pozwala unikn\u0105\u0107 problem\u00f3w, kt\u00f3re zwykle wychodz\u0105 dopiero na produkcji. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1484,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[],"class_list":["post-1483","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jezyk-programowania"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1483"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1483\/revisions"}],"predecessor-version":[{"id":1485,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1483\/revisions\/1485"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1484"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}