Case StudiesBlogO nas
Porozmawiajmy

Jak opanować niestandardową walidację w Pydantic: kompletny przewodnik

Marek Majdak

14 sie 20248 min czytania

Data Analysis Data science

Spis treści

  • Wprowadzenie do niestandardowej walidacji w Pydantic

    • Czym jest Pydantic?

    • Dlaczego niestandardowa walidacja jest ważna

    • Pierwsze kroki z Pydantic

  • Podstawowa walidacja w Pydantic

    • Domyślne możliwości walidacji

    • Typowe zastosowania

    • Ograniczenia domyślnej walidacji

  • Tworzenie własnych walidatorów

    • Tworzenie pierwszego własnego walidatora

    • Obsługa wyjątków walidacji

    • Ponowne użycie własnych walidatorów

  • Zaawansowane techniki niestandardowej walidacji

    • Modele zagnieżdżone i niestandardowa walidacja

    • Walidacja warunkowa

    • Łączenie wielu walidatorów

  • Dobre praktyki i wskazówki

    • Debugowanie własnych walidatorów

    • Kwestie wydajności

    • Przykłady z życia wzięte

Walidacja danych to kluczowy element zapewniający integralność i niezawodność aplikacji. Pydantic, potężna biblioteka do walidacji danych i zarządzania ustawieniami, oferuje uproszczone podejście do realizacji tych zadań. Jedną z jej najważniejszych funkcji jest możliwość tworzenia niestandardowych reguł walidacji dopasowanych do konkretnych wymagań. Ten przewodnik zagłębia się w praktyczne aspekty opanowania niestandardowej walidacji w Pydantic, proponując krok po kroku sposób wdrożenia i efektywnego wykorzystania tej funkcjonalności. Niezależnie od tego, czy jesteś doświadczonym programistą, czy dopiero zaczynasz, ten kompleksowy poradnik wyposaży Cię w wiedzę, dzięki której z pewnością usprawnisz procesy walidacji danych.

Wprowadzenie do niestandardowej walidacji w Pydantic

Czym jest Pydantic?

Pydantic to solidna biblioteka w Pythonie stworzona do walidacji danych i zarządzania ustawieniami. Opiera się na definiowaniu modeli danych z użyciem adnotacji typów w Pythonie, co gwarantuje, że dane są walidowane i przekształcane do wskazanych typów. Dzięki temu świetnie sprawdza się przy obsłudze danych wejściowych w aplikacjach webowych, API oraz zadaniach przetwarzania danych. Siłą Pydantic jest prostota oraz możliwość definiowania własnych reguł walidacji, w tym walidatorów na poziomie modelu (model validators). Dzięki nim programiści mogą skutecznie egzekwować logikę biznesową i integralność danych. Ta zdolność do tworzenia dopasowanych reguł walidacji wyróżnia Pydantic na tle innych bibliotek i czyni go nieodzownym narzędziem w zestawie programisty Pythona. Niezależnie od tego, czy pracujesz z prostymi formularzami, czy złożonymi strukturami, Pydantic upraszcza pracę i dba o to, by dane w Twojej aplikacji były spójne i wiarygodne.

Dlaczego niestandardowa walidacja jest ważna

Niestandardowa walidacja jest kluczowa, ponieważ gwarantuje, że dane spełniają specyficzne, często unikatowe reguły biznesowe i wymagania. Domyślna walidacja sprawdza typy i formaty, ale niestandardowa idzie krok dalej – egzekwuje zasady charakterystyczne dla Twojego kontekstu. Przykładowo, możesz wymagać, by wiek użytkownika mieścił się w określonym zakresie albo by adres e‑mail należał do konkretnej domeny. Możliwości Pydantic w zakresie custom validation pozwalają wdrożyć takie niuanse bez wysiłku, podnosząc niezawodność i funkcjonalność aplikacji. Takie dopasowanie nie tylko zapobiega błędom, ale też poprawia jakość danych, prowadząc do bardziej odpornych i bezpiecznych rozwiązań. Opanowanie niestandardowej walidacji w Pydantic umożliwia tworzenie elastycznych, łatwiejszych w utrzymaniu i precyzyjnych procesów przetwarzania danych, które skutecznie realizują wszystkie unikatowe wymagania aplikacji.

Pierwsze kroki z Pydantic

Aby zacząć korzystać z Pydantic, najpierw zainstaluj bibliotekę poleceniem pip install pydantic. Następnie możesz definiować modele danych. Model Pydantic to klasa w Pythonie dziedzicząca po pydantic.BaseModel. Wewnątrz klasy definiujesz atrybuty i ich typy. Na przykład:

from pydantic import BaseModel class User(BaseModel): name: str age: int email: str

W tym przykładzie model User ma trzy atrybuty: name, age i email, każdy ze wskazanym typem. Pydantic automatycznie obsługuje walidację i konwersję typów danych, w tym konwersję wejściowych wartości str przy tworzeniu instancji modelu. Jeśli dane wejściowe nie pasują do oczekiwanych typów, Pydantic zgłosi ValidationError. Ten prosty fundament pozwala następnie budować bardziej zaawansowane, niestandardowe walidacje, stopniowo zwiększając złożoność w miarę potrzeb.

Podstawowa walidacja w Pydantic

Domyślne możliwości walidacji

Pydantic oferuje szereg domyślnych mechanizmów, które upraszczają zapewnianie integralności danych i wydajną walidację. Po pierwsze, automatycznie sprawdza typy. Jeśli pole zdefiniowano jako liczbę całkowitą, a otrzyma ciąg znaków, Pydantic zwróci ValidationError. Obsługuje również złożone struktury, takie jak listy, słowniki i zagnieżdżone modele, walidując każdy element. Przydatna jest też automatyczna konwersja typów – gdzie to możliwe, dane są przekształcane do zadanego typu (np. ciąg reprezentujący liczbę do int). Pydantic ma wbudowane wsparcie dla walidacji popularnych typów, takich jak adresy e‑mail, URL czy UUID, dzięki bogatemu zestawowi typów pól i walidatorów. Te funkcje tworzą mocny fundament, który zaspokaja najczęstsze potrzeby walidacji od razu po wyjęciu z pudełka.

Typowe zastosowania

Domyślne mechanizmy walidacji w Pydantic sprawdzają się w wielu scenariuszach. Bardzo częste jest walidowanie formularzy w aplikacjach webowych, gdzie Pydantic dba o poprawność danych użytkownika przed ich przetworzeniem. Równie typowe jest walidowanie danych API, zwłaszcza przy obsłudze przychodzących ładunków JSON. Modele Pydantic potrafią sprawdzić i sparsować te dane, weryfikując strukturę i typy. Biblioteka jest też nieoceniona w zadaniach przetwarzania danych, gdy wejście z różnych źródeł trzeba ujednolicić. Często wykorzystuje się ją również do zarządzania konfiguracją – walidując ustawienia z plików konfiguracyjnych lub zmiennych środowiskowych. Te przykłady podkreślają wszechstronność i siłę Pydantic w różnych dziedzinach, czyniąc go domyślnym wyborem dla programistów Pythona wymagających niezawodnej i wydajnej walidacji.

Ograniczenia domyślnej walidacji

Mimo że domyślna walidacja w Pydantic jest potężna, ma ograniczenia, które mogą wymagać zastosowania rozwiązań niestandardowych. Ogólne walidatory nie pokrywają złożonej logiki biznesowej specyficznej dla Twojej aplikacji. Na przykład sprawdzenie, czy data mieści się w danym zakresie, albo czy nazwa użytkownika jest unikalna w bazie, wykracza poza proste sprawdzanie typów. Domyślna walidacja nie wspiera też logiki warunkowej, takiej jak walidowanie jednego pola na podstawie wartości innego. Bywa to ograniczające w sytuacjach, gdzie pola są współzależne. Kolejnym problemem jest brak walidacji świadomej kontekstu, istotnej, gdy zasady zależą od czynników zewnętrznych lub dynamicznych kryteriów. Te ograniczenia pokazują potrzebę walidacji niestandardowej, która pozwala wprowadzić precyzyjne, kontekstowe reguły zapewniające integralność danych i realizujące wszystkie unikatowe wymagania biznesowe.

Tworzenie własnych walidatorów

Tworzenie pierwszego własnego walidatora

Tworzenie niestandardowych walidatorów w Pydantic jest proste i pozwala egzekwować zasady wykraczające poza podstawową walidację typów. Do napisania walidatora użyj dekoratora @validator dostarczanego przez Pydantic. Aplikuje się go do metody w klasie dziedziczącej po BaseModel, wskazując, które pole(a) ma walidować. Na przykład:

from pydantic import BaseModel, validator class User(BaseModel): name: str age: int @validator('age') def check_age(cls, value): if value < 18: raise ValueError('Wiek musi wynosić co najmniej 18 lat') return value

W tym przykładzie metoda check_age sprawdza, czy pole age ma co najmniej 18. Jeśli warunek nie jest spełniony, zgłaszany jest ValueError, w przeciwnym razie wartość zostaje zaakceptowana. Takie podejście pozwala enkapsulować złożoną logikę walidacji w modelach danych i dopasować ją do wymagań aplikacji. Zaczynając od prostych walidatorów, możesz w razie potrzeby stopniowo budować bardziej złożone reguły.

Obsługa wyjątków walidacji

Podczas implementacji niestandardowych walidatorów ważna jest właściwa obsługa wyjątków, aby aplikacja elegancko radziła sobie z nieprawidłowymi danymi. Pydantic zgłasza ValidationError za każdym razem, gdy walidacja zawiedzie — czy to w wyniku domyślnych, czy niestandardowych reguł — i może to być jeden lub wiele błędów. Aby je obsłużyć, otocz tworzenie instancji modelu lub kod walidacji blokiem try-except. Na przykład:

from pydantic import BaseModel, ValidationError, validator class User(BaseModel): name: str age: int @validator('age') def check_age(cls, value): if value < 18: raise ValueError('Wiek musi wynosić co najmniej 18 lat') return value try: user = User(name='Alice', age=15) except ValidationError as e: print(e.json())

W tym przykładzie próba utworzenia instancji User z nieprawidłowym wiekiem skutkuje ValidationError. Wyjątek jest przechwycony, a szczegóły wypisane w formacie JSON. Dzięki temu możesz zwrócić użytkownikom czytelną informację zwrotną lub zalogować błąd do debugowania, zapewniając, że nieprawidłowe dane nie spowodują nieoczekiwanego działania aplikacji.

Ponowne użycie własnych walidatorów

Jedną z zalet Pydantic jest możliwość ponownego wykorzystania niestandardowych walidatorów w wielu modelach, co zapewnia spójną logikę walidacji w całej aplikacji. Możesz definiować walidatory jako funkcje pomocnicze lub metody klasowe i stosować je z dekoratorem @validator w różnych modelach. Na przykład:

from pydantic import BaseModel, validator def validate_age(cls, value): if value < 18: raise ValueError('Wiek musi wynosić co najmniej 18 lat') return value class User(BaseModel): name: str age: int @validator('age') def check_age(cls, value): return validate_age(cls, value) class Employee(BaseModel): emp_id: int age: int @validator('age') def validate_employee_age(cls, value): return validate_age(cls, value)

W tym przykładzie funkcja validate_age jest zdefiniowana raz i użyta w modelach User oraz Employee. Takie podejście wspiera ponowne wykorzystanie i utrzymanie kodu, zmniejsza duplikację oraz gwarantuje, że wszystkie modele stosują te same reguły walidacji. Centralizując własne walidatory, ułatwiasz ich aktualizację i zarządzanie logiką walidacji w całej aplikacji.

Zaawansowane techniki niestandardowej walidacji

Modele zagnieżdżone i niestandardowa walidacja

Pydantic świetnie radzi sobie ze złożonymi strukturami danych, w tym z modelami zagnieżdżonymi, które są niezbędne do reprezentowania hierarchii. Dla takich modeli możesz stosować walidację na wielu poziomach. Rozważ sytuację, w której model User zawiera model Address:

from pydantic import BaseModel, validator class Address(BaseModel): street: str city: str postcode: str @validator('postcode') def validate_postcode(cls, value): if len(value) != 6: raise ValueError('Kod pocztowy musi mieć dokładnie 6 znaków') return value class User(BaseModel): name: str age: int address: Address @validator('age') def check_age(cls, value): if value < 18: raise ValueError('Wiek musi wynosić co najmniej 18 lat') return value

W tym przykładzie model Address zawiera walidator dla pola postcode, który wymaga dokładnie 6 znaków. Model User ma pole zagnieżdżone Address oraz własny walidator dla age. Dzięki temu walidacja jest granularna: każdy zagnieżdżony model ma własne zasady, przy zachowaniu spójności całej struktury danych.

Walidacja warunkowa

Walidacja warunkowa jest niezbędna, gdy poprawność jednego pola zależy od wartości innego. W Pydantic możesz ją zaimplementować przy użyciu niestandardowych walidatorów działających jako field validators. Na przykład, jeśli Employee może być FullTime lub PartTime, a pole hours_per_week należy zweryfikować odpowiednio do typu zatrudnienia:

from pydantic import BaseModel, validator class Employee(BaseModel): name: str employment_type: str hours_per_week: int @validator('hours_per_week') def validate_hours(cls, value, values): if values['employment_type'] == 'FullTime' and value < 35: raise ValueError('Pracownik FullTime musi pracować co najmniej 35 godzin tygodniowo') if values['employment_type'] == 'PartTime' and value > 34: raise ValueError('Pracownik PartTime nie może pracować więcej niż 34 godziny tygodniowo') return value

W tym przykładzie metoda validate_hours sprawdza najpierw pole employment_type, a dopiero potem weryfikuje hours_per_week. Jeśli warunki nie są spełnione, zgłaszany jest ValueError. Takie podejście zapewnia walidację w kontekście powiązanych pól, czyniąc cały proces bardziej dynamicznym i świadomym kontekstu. Scenariusze walidacji warunkowej są częste w realnych aplikacjach, a ich opanowanie znacząco zwiększa odporność i elastyczność rozwiązania.

Łączenie wielu walidatorów

Łączenie wielu walidatorów w Pydantic pozwala egzekwować serię reguł dla jednego pola, zapewniając kompleksową kontrolę jakości danych. Można to osiągnąć poprzez „nakładanie” wielu dekoratorów @validator lub zdefiniowanie kilku metod walidujących to samo pole. Na przykład:

from pydantic import BaseModel, validator class Product(BaseModel): name: str price: float @validator('price') def check_positive_price(cls, value): if value <= 0: raise ValueError('Cena musi być dodatnia') return value @validator('price') def check_reasonable_price(cls, value): if value > 10000: raise ValueError('Cena wydaje się nienaturalnie wysoka') return value

W tym przykładzie pole price jest sprawdzane przez dwa walidatory: check_positive_price gwarantuje, że cena jest dodatnia, a check_reasonable_price pilnuje, aby nie przekraczała określonego progu. Dzięki połączeniu wielu walidatorów stosujesz warstwowe podejście do walidacji, wychwytując szersze spektrum potencjalnych błędów i podnosząc niezawodność przetwarzania danych.

Dobre praktyki i wskazówki

Debugowanie własnych walidatorów

Debugowanie niestandardowych walidatorów w Pydantic jest proste, jeśli podejdziesz do niego metodycznie. Zacznij od wyraźnego wydzielenia logiki walidacji i jej udokumentowania. Użyj printów lub logowania, aby wyświetlać wartości pośrednie i śledzić przepływ danych w walidatorach. Na przykład:

from pydantic import BaseModel, validator class User(BaseModel): name: str age: int @validator('age') def check_age(cls, value): print(f'Validating age: {value}') # Linia do debugowania if value < 18: raise ValueError('Wiek musi wynosić co najmniej 18 lat') return value

W tym przykładzie print pomaga śledzić wartości poddawane walidacji. Jeśli walidacja zawiedzie, wypisane informacje wskażą źródło problemu. Dodatkowo, formułuj czytelne komunikaty błędów w walidatorach – ułatwią zrozumienie tego, co poszło nie tak. Testuj walidatory na zróżnicowanych danych, w tym przypadkach brzegowych, aby mieć pewność, że poprawnie obsługują wszystkie scenariusze. Połączenie tych technik pozwoli sprawnie identyfikować i usuwać problemy, zapewniając solidną, niezawodną walidację.

Kwestie wydajności

Implementując niestandardowe walidatory w Pydantic, warto pamiętać o wpływie na wydajność, zwłaszcza w aplikacjach o dużym obciążeniu. Własne walidatory mogą wprowadzać narzut, szczególnie gdy zawierają złożoną logikę lub odwołania do zewnętrznych źródeł danych. Aby temu przeciwdziałać, dbaj o efektywność funkcji walidujących. Minimalizuj kosztowne obliczenia i unikaj zbędnych sprawdzeń. Jeśli walidację da się zrealizować prostym warunkiem, wybierz właśnie to rozwiązanie.

Rozważ także cache’owanie wyników kosztownych operacji, jeśli mogą być ponownie użyte. Wykorzystaj wbudowane mechanizmy Pydantic, takie jak @root_validator(pre=True), aby wykonywać wczesną walidację i odrzucać nieprawidłowe dane, zanim przejdziesz do dalszego przetwarzania. Pomocne jest profilowanie aplikacji w celu identyfikacji wąskich gardeł — narzędzia takie jak cProfile i line_profiler wskażą miejsca, w których walidatory mogą wpływać na wydajność. Świadomie podchodząc do tych kwestii, zapewnisz walidatorom skuteczność i efektywność bez pogarszania osiągów aplikacji.

Przykłady z życia wzięte

Niestandardowa walidacja w Pydantic znajduje zastosowanie w wielu dziedzinach. W e‑commerce walidatory dbają o integralność danych produktów, np. wymuszając dodatnie ceny i nienegatywne stany magazynowe. Przykładowo można zagwarantować, że rabat nie przekroczy 50%:

from pydantic import BaseModel, validator class Product(BaseModel): name: str price: float discount: float @validator('discount') def check_discount(cls, value, values): if value > 50: raise ValueError('Rabat nie może przekraczać 50%') return value

W systemach opieki zdrowotnej Pydantic waliduje dane pacjentów, np. sprawdzając, czy data urodzenia jest w przeszłości i czy rekordy medyczne mają właściwy format. W finansach walidatory dbają, by kwoty transakcji mieściły się w dozwolonych limitach, a numery kont pasowały do określonych wzorców. Takie przykłady pokazują, jak Pydantic dzięki prostym i niestandardowym walidatorom utrzymuje integralność danych, egzekwuje reguły biznesowe i podnosi niezawodność różnorodnych systemów.

Opublikowany 14 sierpnia 2024

Udostępnij


Marek Majdak

Head of Development

Digital Transformation Strategy for Siemens Finance

Cloud-based platform for Siemens Financial Services in Poland

See full Case Study
Ad image
Abstract digital cloud network representing future cloud transformation trends
Nie przegap żadnego artykułu - zapisz się do naszego newslettera
Zgadzam się na otrzymywanie komunikacji marketingowej od Startup House. Kliknij, aby zobaczyć szczegóły

Może Ci się również spodobać...

Jak mierzyć wskaźniki jakości danych: dogłębna analiza jakości danych
Data Analysis Data scienceDigital products

Jak mierzyć wskaźniki jakości danych: dogłębna analiza jakości danych

Metryki jakości to kompas, który prowadzi współczesne firmy ku doskonałości. W świecie napędzanym danymi zrozumienie, jak je mierzyć i wykorzystywać — zwłaszcza w kontekście Azure i Snowflake — może być przełomem. Zapraszamy na pogłębioną podróż po świecie metryk jakości, aby odkryć ich potencjał w doskonaleniu produktów, usług i procesów. Dowiedz się, jak wspierają podejmowanie decyzji, podnoszą satysfakcję klientów i obniżają koszty dzięki wczesnemu wychwytywaniu błędów. W tym przewodniku pokażemy, czym są metryki jakości, po co je stosować i jak to robić, a także jakie narzędzia pomagają zautomatyzować ten kluczowy proces. Na koniec zrozumiesz, jaką rolę metryki jakości odgrywają w budowaniu sukcesu firm w dzisiejszym, opartym na danych krajobrazie biznesowym.

Olaf Kühn

04 wrz 20234 min czytania

Od danych do zysków: wpływ analityki predykcyjnej na handel detaliczny 💰
Data Analysis Product development

Od danych do zysków: wpływ analityki predykcyjnej na handel detaliczny 💰

Ten kompleksowy przewodnik pokazuje transformacyjny potencjał analityki predykcyjnej w handlu detalicznym, oferując małym i średnim firmom wskazówki, jak wykorzystać zaawansowaną analizę danych do prognozowania trendów, zrozumienia zachowań klientów i efektywnego zarządzania zapasami. Dzięki modelom predykcyjnym i uczeniu maszynowemu detaliści mogą zwiększyć satysfakcję klientów, dopasować kampanie marketingowe do indywidualnych preferencji i zyskać przewagę konkurencyjną. Niezależnie od tego, czy działasz w USA, w regionie DACH, czy w Polsce, odkryj, jak analityka predykcyjna może przekuć Twoje dane w dochodowe strategie i napędzać zrównoważony wzrost.

Marek Pałys

03 kwi 20246 min czytania

Uwolnij potencjał wzrostu: jak narzędzia BI open source mogą przekształcić Twoją firmę
Business planDigital productsData Analysis

Uwolnij potencjał wzrostu: jak narzędzia BI open source mogą przekształcić Twoją firmę

Narzędzia Business Intelligence (BI) typu open source zapewniają startupom i małym firmom opłacalny sposób na wykorzystanie zaawansowanej analityki danych. Są nie tylko przystępne cenowo, ale też łatwe do dostosowania, dzięki czemu firmy mogą wyciągać wnioski wspierające podejmowanie decyzji strategicznych. Dzięki aktualizacjom tworzonym przez społeczność i rozbudowanym funkcjom narzędzia BI open source pomagają wyrównać szanse w świecie Business Intelligence.

Marek Majdak

10 kwi 20249 min czytania

Gotowy, aby scentralizować swoje know-how z pomocą AI?

Rozpocznij nowy rozdział w zarządzaniu wiedzą — gdzie Asystent AI staje się centralnym filarem Twojego cyfrowego wsparcia.

Umów bezpłatną konsultację

Pracuj z zespołem, któremu ufają firmy z czołówki rynku.

Rainbow logo
Siemens logo
Toyota logo

Budujemy to, co będzie dalej.

Firma

Branże

Startup Development House sp. z o.o.

Aleje Jerozolimskie 81

Warszawa, 02-001

VAT-ID: PL5213739631

KRS: 0000624654

REGON: 364787848

Kontakt

hello@startup-house.com

Nasze biuro: +48 789 011 336

Nowy biznes: +48 798 874 852

Obserwuj nas

Award
logologologologo

Copyright © 2026 Startup Development House sp. z o.o.

UE ProjektyPolityka prywatności