Python Academy · पाठ

अपरिवर्तनीय और तुलना विकल्प

अपरिवर्तनीय, क्रमबद्ध dataclass बनाएँ।

पाठ 3, कुल 4 में से13 चरण

अपरिवर्तनीय और तुलना विकल्प, CoddyKit पर Python Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Python Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

डेकोरेटर के विकल्प

@dataclass डेकोरेटर ऐसे कीवर्ड आर्ग्युमेंट स्वीकार करता है जो नियंत्रित करते हैं कि वह कौन-से मेथड बनाएगा। सबसे उपयोगी विकल्प frozen और order हैं।

  • frozen=True इंस्टेंस को अपरिवर्तनशील बनाता है।
  • order=True तुलना ऑपरेटर जोड़ता है।

फ़्रीज़ किए गए डेटाक्लास

frozen=True के साथ बनाया गया वर्ग निर्माण के बाद विशेषताओं का असाइनमेंट रोक देता है। किसी भी प्रयास पर FrozenInstanceError उत्पन्न होता है।

from dataclasses import dataclass, FrozenInstanceError

@dataclass(frozen=True)
class Point:
    x: int
    y: int

p = Point(1, 2)
try:
    p.x = 99
except FrozenInstanceError as e:
    print('Cannot modify:', e)

अपरिवर्तनशीलता क्यों उपयोगी है

अपरिवर्तनशील ऑब्जेक्ट को समझना आसान होता है: निर्माण के बाद उनका मान कभी नहीं बदलता, इसलिए उन्हें फ़ंक्शन और थ्रेड के बीच सुरक्षित रूप से साझा किया जा सकता है। वे शब्दकोश की कुंजी और सेट के सदस्य के रूप में भी सुरक्षित होते हैं।

फ़्रीज़्ड का अर्थ हैश योग्य

फ़्रीज़्ड डेटाक्लास डिफ़ॉल्ट रूप से हैश योग्य होती है, इसलिए आप इसके इंस्टेंस का उपयोग सेट या डिक्शनरी की कुंजी के रूप में कर सकते हैं। म्यूटेबल डेटाक्लास तब तक हैश योग्य नहीं होतीं, जब तक आप इसे स्पष्ट रूप से सक्षम न करें।

from dataclasses import dataclass

@dataclass(frozen=True)
class Point:
    x: int
    y: int

seen = {Point(0, 0), Point(1, 1), Point(0, 0)}
print(len(seen))

फ़्रीज़्ड मानों को बदलना

फ़्रीज़्ड इंस्टेंस को म्यूटेट नहीं किया जा सकता, इसलिए संशोधित कॉपी बनाने के लिए dataclasses.replace() का उपयोग करें। मूल इंस्टेंस अपरिवर्तित रहता है।

from dataclasses import dataclass, replace

@dataclass(frozen=True)
class Point:
    x: int
    y: int

p = Point(1, 2)
q = replace(p, y=99)
print(p)
print(q)

क्रमबद्ध डेटाक्लास

डिफ़ॉल्ट रूप से डेटाक्लास केवल == का समर्थन करती है। order=True जोड़ने पर <, <=, > और >= भी अपने-आप बनाए जाते हैं।

from dataclasses import dataclass

@dataclass(order=True)
class Version:
    major: int
    minor: int

print(Version(1, 2) < Version(1, 5))
print(Version(2, 0) > Version(1, 9))

क्रम की तुलना कैसे होती है

क्रमबद्धता फ़ील्ड की तुलना एक टपल के रूप में, बाएँ से दाएँ, उनके घोषित क्रम में करती है। पहला फ़ील्ड सबसे अधिक महत्वपूर्ण होता है।

from dataclasses import dataclass

@dataclass(order=True)
class Version:
    major: int
    minor: int

# major compared first, then minor
print(Version(1, 9) < Version(2, 0))

डेटाक्लास इंस्टेंस को क्रमबद्ध करना

क्रमबद्ध डेटाक्लास तुलना संचालकों को परिभाषित करती हैं, इसलिए आप उनकी सूची को सीधे sorted() से क्रमबद्ध कर सकते हैं।

from dataclasses import dataclass

@dataclass(order=True)
class Score:
    points: int
    name: str

data = [Score(50, 'B'), Score(90, 'A'), Score(70, 'C')]
for s in sorted(data):
    print(s)

क्रमबद्धता की कुंजी नियंत्रित करना

प्राकृतिक फ़ील्ड क्रम के बजाय किसी और आधार पर क्रमबद्ध करने के लिए field(init=False) से एक छिपा हुआ क्रमबद्धता फ़ील्ड सबसे पहले रखें और उसे __post_init__ में निर्धारित करें। अन्य फ़ील्ड की तुलना से उन्हें compare=False द्वारा बाहर रखा जा सकता है।

from dataclasses import dataclass, field

@dataclass(order=True)
class Item:
    sort_index: int = field(init=False, repr=False)
    name: str = field(compare=False, default='')
    priority: int = 0

    def __post_init__(self):
        self.sort_index = self.priority

print(Item(name='b', priority=2) > Item(name='a', priority=1))

फ़्रीज़्ड और क्रमबद्ध विकल्पों का संयोजन

आप विकल्पों को मिला सकते हैं। फ़्रीज़्ड और क्रमबद्ध डेटाक्लास एक बेहतरीन अपरिवर्तनीय, तुलनीय मान प्रकार बनाती है, जो कुंजियों, संस्करण संख्याओं या निर्देशांकों के लिए आदर्श है।

from dataclasses import dataclass

@dataclass(frozen=True, order=True)
class SemVer:
    major: int
    minor: int
    patch: int

versions = {SemVer(1, 0, 0): 'stable'}
print(SemVer(1, 0, 0) < SemVer(1, 1, 0))
print(versions[SemVer(1, 0, 0)])

ईक्यू और डिफ़ॉल्ट मान

eq विकल्प नियंत्रित करता है कि __eq__ बनाया जाए या नहीं। इसका डिफ़ॉल्ट मान True है। ध्यान दें कि order=True के लिए eq=True आवश्यक है, क्योंकि क्रमबद्धता समानता पर आधारित होती है।

from dataclasses import dataclass

@dataclass(eq=True)
class Tag:
    name: str

print(Tag('x') == Tag('x'))
print(Tag('x') == Tag('y'))

त्वरित जाँच

यदि आप फ़्रीज़्ड डेटाक्लास के इंस्टेंस में किसी फ़ील्ड को मान असाइन करें, तो क्या होगा?

पुनरावलोकन

आपने अपरिवर्तनीय और क्रमबद्ध डेटाक्लास बनाना सीखा।

  • frozen=True म्यूटेशन रोकता है और इंस्टेंस को हैश योग्य बनाता है।
  • संशोधित कॉपी के लिए replace() का उपयोग करें।
  • order=True ऐसे तुलना संचालक बनाता है जो फ़ील्ड की तुलना एक टपल के रूप में करते हैं।
  • दोनों को मिलाकर मजबूत मान प्रकार बनाएँ।
शुरुआत निःशुल्क

एआई शिक्षक के साथ Python सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
76
पाठ
320

अक्सर पूछे जाने वाले प्रश्न

क्या “अपरिवर्तनीय और तुलना विकल्प” पाठ निःशुल्क है?

हाँ—“अपरिवर्तनीय और तुलना विकल्प” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Python Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Python Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“अपरिवर्तनीय और तुलना विकल्प” में मैं क्या सीखूँगा?

अपरिवर्तनीय, क्रमबद्ध dataclass बनाएँ। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Python Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Python Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Python Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“अपरिवर्तनीय और तुलना विकल्प” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Python Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Python Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Dataclass परिभाषित करना
  2. डिफ़ॉल्ट मान और field()
  3. अपरिवर्तनीय और तुलना विकल्प
  4. attrs लाइब्रेरी
← Python Academy पर वापस जाएँ