विषय पर बढ़ें

पाइडेंटिक का उपयोग क्यों करें?

आज, पाइडेंटिक को महीने में कई बार डाउनलोड किया जाता है और दुनिया के कुछ सबसे बड़े और सबसे अधिक पहचाने जाने वाले संगठनों द्वारा इसका उपयोग किया जाता है।

यह जानना कठिन है कि छह साल पहले इसकी स्थापना के बाद से इतने सारे लोगों ने पाइडेंटिक को क्यों अपनाया है, लेकिन यहां कुछ अनुमान दिए गए हैं।

स्कीमा सत्यापन को सशक्त बनाने वाले प्रकार संकेत

पाइडेंटिक जिस स्कीम के विरुद्ध सत्यापन करता है, उसे आम तौर पर पायथन प्रकार के संकेतों द्वारा परिभाषित किया जाता है।

टाइप संकेत इसके लिए बहुत अच्छे हैं, यदि आप आधुनिक पायथन लिख रहे हैं, तो आप पहले से ही जानते हैं कि उनका उपयोग कैसे करना है। प्रकार के संकेतों का उपयोग करने का मतलब यह भी है कि पाइडेंटिक स्थिर टाइपिंग टूल जैसे कि mypy और pyright और IDE जैसे pycharm और vscode के साथ अच्छी तरह से एकीकृत होता है।

???+ उदाहरण "उदाहरण - केवल संकेत टाइप करें" (इस उदाहरण के लिए Python 3.9+ की आवश्यकता है) ```पाइ को आवश्यकता है='3.9' टाइपिंग से एनोटेटेड, डिक्ट, लिस्ट, लिटरल, टुपल आयात करें

from annotated_types import Gt

from pydantic import BaseModel


class Fruit(BaseModel):
    name: str  # (1)!
    color: Literal['red', 'green']  # (2)!
    weight: Annotated[float, Gt(0)]  # (3)!
    bazam: Dict[str, List[Tuple[int, bool, float]]]  # (4)!


print(
    Fruit(
        name='Apple',
        color='red',
        weight=4.2,
        bazam={'foobar': [(1, True, 0.1)]},
    )
)
#> name='Apple' color='red' weight=4.2 bazam={'foobar': [(1, True, 0.1)]}
```

1. The `name` field is simply annotated with `str` - any string is allowed.
2. The [`Literal`](https://docs.python.org/3/library/typing.html#typing.Literal) type is used to enforce that `color` is either `'red'` or `'green'`.
3. Even when we want to apply constraints not encapsulated in python types, we can use [`Annotated`](https://docs.python.org/3/library/typing.html#typing.Annotated) and [`annotated-types`](https://github.com/annotated-types/annotated-types) to enforce constraints without breaking type hints.
4. I'm not claiming "bazam" is really an attribute of fruit, but rather to show that arbitrarily complex types can easily be validated.

!!! टिप "और जानें" समर्थित प्रकारों पर दस्तावेज़ देखें।

प्रदर्शन

पाइडेंटिक का कोर सत्यापन तर्क एक अलग पैकेज पाइडेंटिक-कोर में लागू किया गया है, जहां अधिकांश प्रकारों के लिए सत्यापन रस्ट में लागू किया गया है।

परिणामस्वरूप, पायडेंटिक पायथन के लिए सबसे तेज़ डेटा सत्यापन पुस्तकालयों में से एक है।

??? उदाहरण "प्रदर्शन उदाहरण - पाइडेंटिक बनाम समर्पित कोड" सामान्य तौर पर, समर्पित कोड सामान्य प्रयोजन सत्यापनकर्ता की तुलना में बहुत तेज़ होना चाहिए, लेकिन इस उदाहरण में JSON को पार्स करते समय और यूआरएल को मान्य करते समय पाइडेंटिक समर्पित कोड की तुलना में >300% तेज़ है।

```py title="Performance Example"
import json
import timeit
from urllib.parse import urlparse

import requests

from pydantic import HttpUrl, TypeAdapter

reps = 7
number = 100
r = requests.get('https://api.github.com/emojis')
r.raise_for_status()
emojis_json = r.content


def emojis_pure_python(raw_data):
    data = json.loads(raw_data)
    output = {}
    for key, value in data.items():
        assert isinstance(key, str)
        url = urlparse(value)
        assert url.scheme in ('https', 'http')
        output[key] = url


emojis_pure_python_times = timeit.repeat(
    'emojis_pure_python(emojis_json)',
    globals={
        'emojis_pure_python': emojis_pure_python,
        'emojis_json': emojis_json,
    },
    repeat=reps,
    number=number,
)
print(f'pure python: {min(emojis_pure_python_times) / number * 1000:0.2f}ms')
#> pure python: 5.32ms

type_adapter = TypeAdapter(dict[str, HttpUrl])
emojis_pydantic_times = timeit.repeat(
    'type_adapter.validate_json(emojis_json)',
    globals={
        'type_adapter': type_adapter,
        'HttpUrl': HttpUrl,
        'emojis_json': emojis_json,
    },
    repeat=reps,
    number=number,
)
print(f'pydantic: {min(emojis_pydantic_times) / number * 1000:0.2f}ms')
#> pydantic: 1.54ms

print(
    f'Pydantic {min(emojis_pure_python_times) / min(emojis_pydantic_times):0.2f}x faster'
)
#> Pydantic 3.45x faster
```

संकलित भाषाओं में लिखे गए अन्य प्रदर्शन-केंद्रित पुस्तकालयों के विपरीत, पाइडेंटिक के पास कार्यात्मक सत्यापनकर्ताओं के माध्यम से सत्यापन को अनुकूलित करने के लिए उत्कृष्ट समर्थन भी है।

!!! टिप "और जानें" PyCon 2023 में सैमुअल कॉल्विन की बातचीत बताती है कि पाइडेंटिक-कोर कैसे काम करता है और यह पाइडेंटिक के साथ कैसे एकीकृत होता है।

क्रमबद्धता

पाइडेंटिक मॉडल को तीन तरीकों से क्रमबद्ध करने की कार्यक्षमता प्रदान करता है:

  1. संबंधित पायथन ऑब्जेक्ट्स से बने पायथन निर्देश के लिए
  2. केवल "jsonable" प्रकारों से बने पायथन निर्देश के लिए
  3. एक JSON स्ट्रिंग के लिए

सभी तीन मोड में, आउटपुट को विशिष्ट फ़ील्ड को छोड़कर, अनसेट फ़ील्ड को छोड़कर, डिफ़ॉल्ट मानों को छोड़कर, और कोई नहीं मानों को छोड़कर अनुकूलित किया जा सकता है

??? उदाहरण "उदाहरण - क्रमबद्धता 3 तरीके" ```डेटाटाइम आयात डेटटाइम से py

from pydantic import BaseModel


class Meeting(BaseModel):
    when: datetime
    where: bytes
    why: str = 'No idea'


m = Meeting(when='2020-01-01T12:00', where='home')
print(m.model_dump(exclude_unset=True))
#> {'when': datetime.datetime(2020, 1, 1, 12, 0), 'where': b'home'}
print(m.model_dump(exclude={'where'}, mode='json'))
#> {'when': '2020-01-01T12:00:00', 'why': 'No idea'}
print(m.model_dump_json(exclude_defaults=True))
#> {"when":"2020-01-01T12:00:00","where":"home"}
```

!!! टिप "और जानें" क्रमांकन पर दस्तावेज़ देखें।

JSON स्कीमा

JSON स्कीमा को किसी भी पाइडेंटिक स्कीमा के लिए तैयार किया जा सकता है - स्व-दस्तावेजीकरण एपीआई और विभिन्न प्रकार के उपकरणों के साथ एकीकरण की अनुमति देता है जो JSON स्कीमा का समर्थन करते हैं।

??? उदाहरण "उदाहरण - JSON स्कीमा" ```डेटाटाइम आयात डेटाटाइम से py

from pydantic import BaseModel कक्षा का पता (बेसमॉडल): सड़क: स्ट्रीट शहर: स्ट्रीट ज़िपकोड: str क्लास मीटिंग(बेसमॉडल): कब: दिनांकसमय कहां: पता क्यों: str = 'कोई जानकारी नहीं' प्रिंट(Meeting.model_json_schema()) """ { ' $defs': { 'पता': { 'गुण': { 'सड़क': {'शीर्षक': 'सड़क', 'प्रकार': 'स्ट्रिंग'}, 'शहर': {'शीर्षक': 'शहर', 'प्रकार': 'स्ट्रिंग'}, 'ज़िपकोड': {'शीर्षक': 'ज़िपकोड', 'प्रकार': 'स्ट्रिंग'}, }, 'आवश्यक': ['सड़क', 'शहर', 'ज़िपकोड'], 'शीर्षक': 'पता', 'प्रकार': 'ऑब्जेक्ट', } }, 'गुण': { 'कब': {'प्रारूप': 'दिनांक-समय', 'शीर्षक': 'कब', 'प्रकार': 'स्ट्रिंग'}, 'कहां': {'$ रेफरी': '#/$defs/पता'}, 'क्यों': {'डिफ़ॉल्ट': 'कोई जानकारी नहीं', 'शीर्षक': 'क्यों', 'प्रकार': 'स्ट्रिंग'}, }, 'आवश्यक': ['कब', 'कहां'], 'शीर्षक': 'बैठक', 'प्रकार': 'ऑब्जेक्ट', } """ ```

पाइडेंटिक JSON स्कीमा संस्करण 2020-12 उत्पन्न करता है, जो मानक का नवीनतम संस्करण है जो ओपनएपीआई 3.1 के साथ संगत है।

!!! टिप "और जानें" JSON स्कीमा पर दस्तावेज़ देखें।

सख्त मोड और डेटा जबरदस्ती

डिफ़ॉल्ट रूप से, पाइडेंटिक सामान्य गलत प्रकारों के प्रति सहनशील है और डेटा को सही प्रकार पर ले जाता है - उदाहरण के लिए एक इंट फ़ील्ड में पास की गई एक संख्यात्मक स्ट्रिंग को एक इंट के रूप में पार्स किया जाएगा।

पाइडेंटिक में स्ट्रिक्ट = ट्रू मोड भी है - जिसे "स्ट्रिक्ट मोड" के रूप में भी जाना जाता है - जहां प्रकारों को बाध्य नहीं किया जाता है और एक सत्यापन त्रुटि तब तक उठाई जाती है जब तक कि इनपुट डेटा स्कीमा या प्रकार संकेत से बिल्कुल मेल नहीं खाता।

लेकिन JSON डेटा को मान्य करते समय सख्त मोड बहुत बेकार होगा क्योंकि JSON में डेटाटाइम, यूयूआईडी या बाइट्स जैसे कई सामान्य पायथन प्रकारों से मेल खाने वाले प्रकार नहीं होते हैं।

इसे हल करने के लिए, Pydantic एक चरण में JSON को पार्स और मान्य कर सकता है। यह RFC3339 (उर्फ ISO8601) स्ट्रिंग्स जैसे समझदार डेटा रूपांतरण को डेटाटाइम ऑब्जेक्ट में बदलने की अनुमति देता है। चूंकि JSON पार्सिंग को रस्ट में लागू किया गया है, इसलिए यह बहुत ही उपयोगी है।

??? उदाहरण "उदाहरण - सख्त मोड जो वास्तव में उपयोगी है" ```डेटाटाइम आयात डेटटाइम से py

from pydantic import BaseModel, ValidationError


class Meeting(BaseModel):
    when: datetime
    where: bytes


m = Meeting.model_validate({'when': '2020-01-01T12:00', 'where': 'home'})
print(m)
#> when=datetime.datetime(2020, 1, 1, 12, 0) where=b'home'
try:
    m = Meeting.model_validate(
        {'when': '2020-01-01T12:00', 'where': 'home'}, strict=True
    )
except ValidationError as e:
    print(e)
    """
    2 validation errors for Meeting
    when
      Input should be a valid datetime [type=datetime_type, input_value='2020-01-01T12:00', input_type=str]
    where
      Input should be a valid bytes [type=bytes_type, input_value='home', input_type=str]
    """

m_json = Meeting.model_validate_json(
    '{"when": "2020-01-01T12:00", "where": "home"}'
)
print(m_json)
#> when=datetime.datetime(2020, 1, 1, 12, 0) where=b'home'
```

!!! टिप "और जानें" स्ट्रिक्ट मोड पर दस्तावेज़ देखें।

डेटाक्लास, टाइप्डडिक्ट्स, और बहुत कुछ

पाइडेंटिक स्कीमा बनाने और सत्यापन और क्रमांकन करने के चार तरीके प्रदान करता है:

  1. बेसमॉडल - उदाहरण विधियों के माध्यम से उपलब्ध कई सामान्य उपयोगिताओं के साथ पाइडेंटिक का अपना सुपर क्लास।
  2. pydantic.dataclasses.dataclass - मानक डेटाक्लास के चारों ओर एक आवरण जो डेटाक्लास आरंभ होने पर सत्यापन करता है।
  3. TypeAdapter - सत्यापन और क्रमबद्धता के लिए किसी भी प्रकार को अनुकूलित करने का एक सामान्य तरीका। यह टाइपेडडिक्ट और नेम्डटुपल जैसे प्रकारों के साथ-साथ इंट या टाइमडेल्टा जैसे सरल स्केलर मानों को मान्य करने की अनुमति देता है - समर्थित सभी प्रकारों का उपयोग टाइपएडाप्टर के साथ किया जा सकता है।
  4. वैलिडेट_कॉल - किसी फ़ंक्शन को कॉल करते समय सत्यापन करने के लिए एक डेकोरेटर।

??? उदाहरण "उदाहरण - टाइप्डडिक्ट पर आधारित स्कीमा" ```डेटाटाइम आयात डेटटाइम से py

from typing_extensions import NotRequired, TypedDict

from pydantic import TypeAdapter


class Meeting(TypedDict):
    when: datetime
    where: bytes
    why: NotRequired[str]


meeting_adapter = TypeAdapter(Meeting)
m = meeting_adapter.validate_python(  # (1)!
    {'when': '2020-01-01T12:00', 'where': 'home'}
)
print(m)
#> {'when': datetime.datetime(2020, 1, 1, 12, 0), 'where': b'home'}
meeting_adapter.dump_python(m, exclude={'where'})  # (2)!

print(meeting_adapter.json_schema())  # (3)!
"""
{
    'properties': {
        'when': {'format': 'date-time', 'title': 'When', 'type': 'string'},
        'where': {'format': 'binary', 'title': 'Where', 'type': 'string'},
        'why': {'title': 'Why', 'type': 'string'},
    },
    'required': ['when', 'where'],
    'title': 'Meeting',
    'type': 'object',
}
"""
```

1. `TypeAdapter` for a `TypedDict` performing validation, it can also validate JSON data directly with `validate_json`
2. `dump_python` to serialise a `TypedDict` to a python object, it can also serialise to JSON with `dump_json`
3. `TypeAdapter` can also generate JSON Schema

.Customization

कार्यात्मक सत्यापनकर्ता और क्रमबद्धकर्ता, साथ ही कस्टम प्रकारों के लिए एक शक्तिशाली प्रोटोकॉल का मतलब है कि पाइडेंटिक के संचालन के तरीके को प्रति-फ़ील्ड या प्रति-प्रकार के आधार पर अनुकूलित किया जा सकता है।

??? उदाहरण "कस्टमाइज़ेशन उदाहरण - रैप वैलिडेटर" "रैप वैलिडेटर" पाइडेंटिक V2 में नए हैं और पाइडेंटिक वैलिडेशन को अनुकूलित करने के सबसे शक्तिशाली तरीकों में से एक हैं। ```डेटाटाइम आयात डेटटाइम, टाइमज़ोन से py

from pydantic import BaseModel, field_validator


class Meeting(BaseModel):
    when: datetime

    @field_validator('when', mode='wrap')
    def when_now(cls, input_value, handler):
        if input_value == 'now':
            return datetime.now()
        when = handler(input_value)
        # in this specific application we know tz naive datetimes are in UTC
        if when.tzinfo is None:
            when = when.replace(tzinfo=timezone.utc)
        return when


print(Meeting(when='2020-01-01T12:00+01:00'))
#> when=datetime.datetime(2020, 1, 1, 12, 0, tzinfo=TzInfo(+01:00))
print(Meeting(when='now'))
#> when=datetime.datetime(2032, 1, 2, 3, 4, 5, 6)
print(Meeting(when='2020-01-01T12:00'))
#> when=datetime.datetime(2020, 1, 1, 12, 0, tzinfo=datetime.timezone.utc)
```

!!! टिप "और जानें" सत्यापनकर्ताओं, कस्टम सीरियलाइज़र और कस्टम प्रकारों पर दस्तावेज़ देखें।

पारिस्थितिकी तंत्र

लेखन के समय GitHub पर 214,100 रिपॉजिटरी और PyPI पर 8,119 पैकेज हैं जो Pydantic पर निर्भर हैं।

कुछ उल्लेखनीय पुस्तकालय जो पाइडेंटिक पर निर्भर हैं:

पाइडेंटिक का उपयोग करने वाली अधिक लाइब्रेरी क्लूडेक्स/विस्मयकारी-पाइडेंटिक पर पाई जा सकती हैं।

पायडेंटिक का उपयोग करने वाले संगठन

पाइडेंटिक का उपयोग करने वाली कुछ उल्लेखनीय कंपनियाँ और संगठन एक साथ टिप्पणियों के साथ कि हम क्यों/कैसे जानते हैं कि वे पाइडेंटिक का उपयोग कर रहे हैं।

नीचे दिए गए संगठनों को शामिल किया गया है क्योंकि वे निम्नलिखित मानदंडों में से एक या अधिक से मेल खाते हैं:

  • सार्वजनिक भंडार में निर्भरता के रूप में पाइडेंटिक का उपयोग करना
  • किसी संगठन-आंतरिक डोमेन से पाइडेंटिक दस्तावेज़ीकरण साइट पर ट्रैफ़िक का संदर्भ देना - विशिष्ट संदर्भकर्ता शामिल नहीं हैं क्योंकि वे आम तौर पर सार्वजनिक डोमेन में नहीं होते हैं
  • संगठन के भीतर पायडेंटिक के उपयोग के बारे में पायडेंटिक टीम और संगठन द्वारा नियोजित इंजीनियरों के बीच सीधा संचार

जहां उपयुक्त हो, हमने कुछ अतिरिक्त विवरण शामिल किए हैं और वे पहले से ही सार्वजनिक डोमेन में हैं।

{{ organisations }}


本文总阅读量