विषय पर बढ़ें

Dataclasses का उपयोग

🌐 एआई और मनुष्यों द्वारा किया गया अनुवाद

यह अनुवाद मनुष्यों के मार्गदर्शन में एआई द्वारा किया गया है। 🤝

इसमें मूल अर्थ को गलत समझने या अप्राकृतिक लगने आदि जैसी गलतियाँ हो सकती हैं। 🤖

आप हमें एआई LLM को बेहतर मार्गदर्शन करने में मदद करके इस अनुवाद को बेहतर बना सकते हैं।

अंग्रेज़ी संस्करण

FastAPI Pydantic के ऊपर बनाया गया है, और मैंने आपको दिखाया है कि requests और responses घोषित करने के लिए Pydantic models का उपयोग कैसे करें।

लेकिन FastAPI उसी तरह dataclasses का उपयोग भी support करता है:

from dataclasses import dataclass

from fastapi import FastAPI


@dataclass
class Item:
    name: str
    price: float
    description: str | None = None
    tax: float | None = None


app = FastAPI()


@app.post("/items/")
async def create_item(item: Item):
    return item

यह अभी भी Pydantic की वजह से support किया जाता है, क्योंकि इसमें dataclasses के लिए internal support है।

इसलिए, ऊपर दिए गए code में भी, जो Pydantic का स्पष्ट रूप से उपयोग नहीं करता, FastAPI उन standard dataclasses को Pydantic की अपनी तरह की dataclasses में बदलने के लिए Pydantic का उपयोग कर रहा है।

और निश्चित रूप से, यह इन्हें भी support करता है:

  • data validation
  • data serialization
  • data documentation, आदि।

यह Pydantic models की तरह ही काम करता है। और अंदर से यह वास्तव में उसी तरह, Pydantic का उपयोग करके हासिल किया जाता है।

नोट

ध्यान रखें कि dataclasses वह सब कुछ नहीं कर सकतीं जो Pydantic models कर सकते हैं।

इसलिए, आपको अभी भी Pydantic models का उपयोग करना पड़ सकता है।

लेकिन अगर आपके पास बहुत सारी dataclasses पहले से मौजूद हैं, तो FastAPI का उपयोग करके web API को power देने के लिए उनका उपयोग करने की यह एक अच्छी तरकीब है। 🤓

response_model में Dataclasses

आप response_model parameter में भी dataclasses का उपयोग कर सकते हैं:

from dataclasses import dataclass, field

from fastapi import FastAPI


@dataclass
class Item:
    name: str
    price: float
    tags: list[str] = field(default_factory=list)
    description: str | None = None
    tax: float | None = None


app = FastAPI()


@app.get("/items/next", response_model=Item)
async def read_next_item():
    return {
        "name": "Island In The Moon",
        "price": 12.99,
        "description": "A place to be playin' and havin' fun",
        "tags": ["breater"],
    }

dataclass अपने आप Pydantic dataclass में बदल जाएगी।

इस तरह, उसका schema API docs के user interface में दिखाई देगा:

Nested Data Structures में Dataclasses

आप nested data structures बनाने के लिए dataclasses को अन्य type annotations के साथ भी जोड़ सकते हैं।

कुछ मामलों में, आपको अभी भी Pydantic के dataclasses वाले version का उपयोग करना पड़ सकता है। उदाहरण के लिए, अगर automatically generated API documentation में errors हों।

उस स्थिति में, आप standard dataclasses को बस pydantic.dataclasses से बदल सकते हैं, जो एक drop-in replacement है:

from dataclasses import field  # (1)

from fastapi import FastAPI
from pydantic.dataclasses import dataclass  # (2)


@dataclass
class Item:
    name: str
    description: str | None = None


@dataclass
class Author:
    name: str
    items: list[Item] = field(default_factory=list)  # (3)


app = FastAPI()


@app.post("/authors/{author_id}/items/", response_model=Author)  # (4)
async def create_author_items(author_id: str, items: list[Item]):  # (5)
    return {"name": author_id, "items": items}  # (6)


@app.get("/authors/", response_model=list[Author])  # (7)
def get_authors():  # (8)
    return [  # (9)
        {
            "name": "Breaters",
            "items": [
                {
                    "name": "Island In The Moon",
                    "description": "A place to be playin' and havin' fun",
                },
                {"name": "Holy Buddies"},
            ],
        },
        {
            "name": "System of an Up",
            "items": [
                {
                    "name": "Salt",
                    "description": "The kombucha mushroom people's favorite",
                },
                {"name": "Pad Thai"},
                {
                    "name": "Lonely Night",
                    "description": "The mostests lonliest nightiest of allest",
                },
            ],
        },
    ]
  1. हम अभी भी standard dataclasses से field import करते हैं।

  2. pydantic.dataclasses, dataclasses के लिए एक drop-in replacement है।

  3. Author dataclass में Item dataclasses की एक list शामिल है।

  4. Author dataclass को response_model parameter के रूप में उपयोग किया गया है।

  5. आप request body के रूप में dataclasses के साथ अन्य standard type annotations का उपयोग कर सकते हैं।

    इस मामले में, यह Item dataclasses की एक list है।

  6. यहाँ हम एक dictionary return कर रहे हैं जिसमें items है, जो dataclasses की एक list है।

    FastAPI अभी भी data को JSON में serialize करने में सक्षम है।

  7. यहाँ response_model, Author dataclasses की list के type annotation का उपयोग कर रहा है।

    फिर से, आप dataclasses को standard type annotations के साथ जोड़ सकते हैं।

  8. ध्यान दें कि यह path operation function async def की बजाय सामान्य def का उपयोग करता है।

    हमेशा की तरह, FastAPI में आप आवश्यकता के अनुसार def और async def को जोड़ सकते हैं।

    अगर आपको यह याद दिलाने की आवश्यकता है कि किसे कब उपयोग करना है, तो async और await के docs में "जल्दी में हैं?" section देखें।

  9. यह path operation function dataclasses return नहीं कर रहा है (हालाँकि कर सकता था), बल्कि internal data वाली dictionaries की list return कर रहा है।

    FastAPI response को बदलने के लिए response_model parameter (जिसमें dataclasses शामिल हैं) का उपयोग करेगा।

आप जटिल data structures बनाने के लिए dataclasses को कई अलग-अलग combinations में अन्य type annotations के साथ जोड़ सकते हैं।

अधिक विशिष्ट विवरण देखने के लिए ऊपर दिए गए in-code annotation tips देखें।

और जानें

आप dataclasses को अन्य Pydantic models के साथ भी जोड़ सकते हैं, उनसे inherit कर सकते हैं, उन्हें अपने models में शामिल कर सकते हैं, आदि।

अधिक जानने के लिए, dataclasses के बारे में Pydantic docs देखें।

Version

यह FastAPI version 0.67.0 से उपलब्ध है। 🔖