विषय पर बढ़ें

प्रकार अनुकूलक

आपके पास ऐसे प्रकार हो सकते हैं जो BaseModel नहीं हैं जिनके विरुद्ध आप डेटा सत्यापित करना चाहते हैं। या हो सकता है कि आप List[SomeModel] सत्यापित करना चाहें, या उसे JSON पर डंप करना चाहें।

??? एपीआई "एपीआई दस्तावेज़ीकरण" pydantic.type_adapter.TypeAdapter

इस तरह के उपयोग के मामलों के लिए, Pydantic TypeAdapter प्रदान करता है, जिसका उपयोग BaseModel बनाने की आवश्यकता के बिना प्रकार सत्यापन, क्रमबद्धता और JSON स्कीमा पीढ़ी के लिए किया जा सकता है।

एक TypeAdapter उदाहरण उन प्रकारों के लिए BaseModel इंस्टेंस तरीकों से कुछ कार्यक्षमता को उजागर करता है जिनमें ऐसी विधियां नहीं हैं (जैसे डेटाक्लास, आदिम प्रकार, और अधिक):

from typing import List

from typing_extensions import TypedDict

from pydantic import TypeAdapter, ValidationError


class User(TypedDict):
    name: str
    id: int


user_list_adapter = TypeAdapter(List[User])
user_list = user_list_adapter.validate_python([{'name': 'Fred', 'id': '3'}])
print(repr(user_list))
#> [{'name': 'Fred', 'id': 3}]

try:
    user_list_adapter.validate_python(
        [{'name': 'Fred', 'id': 'wrong', 'other': 'no'}]
    )
except ValidationError as e:
    print(e)
    """
    1 validation error for list[typed-dict]
    0.id
      Input should be a valid integer, unable to parse string as an integer [type=int_parsing, input_value='wrong', input_type=str]
    """

print(repr(user_list_adapter.dump_json(user_list)))
#> b'[{"name":"Fred","id":3}]'

!!! जानकारी " dump_json bytes लौटाता है " TypeAdapter की dump_json विधियां bytes ऑब्जेक्ट लौटाती है, BaseModel के लिए संबंधित विधि, model_dump_json के विपरीत, जो एक str लौटाती है। इस विसंगति का कारण यह है कि V1 में, मॉडल डंपिंग ने एक str प्रकार लौटाया, इसलिए इस व्यवहार को बैकवर्ड संगतता के लिए V2 में बनाए रखा गया है। BaseModel मामले के लिए, bytes str प्रकारों के लिए बाध्य किया जाता है, लेकिन bytes अक्सर वांछित अंत प्रकार होते हैं। इसलिए, V2 में नए TypeAdapter वर्ग के लिए, रिटर्न प्रकार बस bytes है, जिसे यदि वांछित हो तो आसानी से एक str प्रकार के लिए मजबूर किया जा सकता है।

!!! नोट RootModel के साथ उपयोग के मामलों में कुछ ओवरलैप के बावजूद, TypeAdapter को BaseModel आदि के फ़ील्ड निर्दिष्ट करने के लिए एक प्रकार के एनोटेशन के रूप में उपयोग नहीं किया जाना चाहिए।

डेटा को एक निर्दिष्ट प्रकार में पार्स करना

TypeAdapter का उपयोग पाइडेंटिक मॉडल को अधिक तदर्थ तरीके से पॉप्युलेट करने के लिए पार्सिंग तर्क को लागू करने के लिए किया जा सकता है। यह फ़ंक्शन BaseModel.model_validate के समान व्यवहार करता है, लेकिन मनमाने ढंग से Pydantic-संगत प्रकारों के साथ काम करता है।

यह विशेष रूप से तब उपयोगी होता है जब आप परिणामों को ऐसे प्रकार में पार्स करना चाहते हैं जो BaseModel का प्रत्यक्ष उपवर्ग नहीं है। उदाहरण के लिए:

from typing import List

from pydantic import BaseModel, TypeAdapter


class Item(BaseModel):
    id: int
    name: str


# `item_data` could come from an API call, eg., via something like:
# item_data = requests.get('https://my-api.com/items').json()
item_data = [{'id': 1, 'name': 'My Item'}]

items = TypeAdapter(List[Item]).validate_python(item_data)
print(items)
#> [Item(id=1, name='My Item')]

TypeAdapter डेटा को किसी भी प्रकार में पार्स करने में सक्षम है जिसे Pydantic BaseModel के फ़ील्ड के रूप में संभाल सकता है।

!!! जानकारी "प्रदर्शन संबंधी विचार" TypeAdapter का एक उदाहरण बनाते समय, प्रदान किए गए प्रकार का विश्लेषण किया जाना चाहिए और एक पाइडेंटिक-कोर स्कीमा में परिवर्तित किया जाना चाहिए। यह कुछ गैर-तुच्छ ओवरहेड के साथ आता है, इसलिए किसी दिए गए प्रकार के लिए केवल एक बार TypeAdapter बनाने और इसे लूप या अन्य प्रदर्शन-महत्वपूर्ण कोड में पुन: उपयोग करने की अनुशंसा की जाती है।


本文总阅读量