Skip to content

पोस्ट

क्या डिपेंडेंसी इंजेक्शन मुझे एक बेहतर Python प्रोग्रामर बना सकता है?

16 फ़रवरी 2025 • 4 मिनट पढ़ना

क्या डिपेंडेंसी इंजेक्शन मुझे एक बेहतर Python प्रोग्रामर बना सकता है?

डिपेंडेंसी इंजेक्शन स्टेटिक भाषाओं में मुख्य आधार है, लेकिन क्या Python में इसका उपयोग करना समझदारी है? क्या यह मुझे एक बेहतर Python प्रोग्रामर बनाएगा?

और रुकिए, डिपेंडेंसी इंजेक्शन क्या है, फिर से?

पहले, आइए इस प्रश्न का उत्तर दें: डिपेंडेंसी इंजेक्शन (DI) क्या है?

डिपेंडेंसी इंजेक्शन एक पैटर्न है जो, जब उपयोग किया जाता है, तो ऑब्जेक्ट के निर्माण को क्लास के बाहर ले जाता है। इसके बजाय, क्लास एक अमूर्तता पर निर्भरता लेती है।

C# और Java जैसी स्टेटिक भाषाओं में, डिपेंडेंसी इंजेक्शन का व्यापक रूप से उपयोग कपलिंग को कम करने और टेस्टिंग को सुविधाजनक बनाने के लिए किया जाता है। वास्तव में, आपको डिपेंडेंसी इंजेक्शन फ्रेमवर्क मिलेंगे जिनका एकमात्र उद्देश्य निर्भरताओं और उनके आपसी संबंधों को बनाए रखना है।

डिपेंडेंसी इंजेक्शन दो मुख्य उद्देश्य पूरे करता है:

पहला, यह एक अमूर्तता पर निर्भरता लेकर जटिलता को कम करता है।

दूसरा, एक अमूर्तता पर निर्भर रहना विभिन्न कार्यान्वयनों की अनुमति देता है, जिसमें टेस्टिंग के लिए मॉक्स भी शामिल हैं, जो क्लास या फ़ंक्शन में पास किए जा सकते हैं।

मुझे कुछ कोड के साथ प्रदर्शित करने दें:

# Before 
class User:
    def __init__(self):
        self.database = SqlServerDatabase()

    def get_details(self, user_id: int):
        self.database.get_user_details(user_id)

# After  
class User:
    def __init__(self, database: Database):
        self.database = database

    def get_details(self, user_id: int):
        self.database.get_user_details(user_id)

यह अपने सबसे सरल रूप में डिपेंडेंसी इंजेक्शन है। जबकि अवधारणा सीधी है, इसकी शक्ति लचीले डिज़ाइन को सक्षम करने में निहित है।

Before उदाहरण में, User क्लास SqlServerDatabase क्लास के साथ कसकर जुड़ी हुई है। यदि हम User क्लास का परीक्षण करना चाहते हैं, तो हमें एक नया SqlServerDatabase इंस्टेंस बनाना होगा।

After उदाहरण में, User क्लास Database अमूर्तता के साथ शिथिल रूप से जुड़ी हुई है। हम User क्लास में Database अमूर्तता का एक अलग कार्यान्वयन पास कर सकते हैं।

मुझे एक व्यावहारिक उदाहरण के साथ इस लचीलेपन को प्रदर्शित करने दें जो दिखाता है कि हम विभिन्न डेटाबेस कार्यान्वयनों के बीच कैसे स्विच कर सकते हैं:

date_string = "2023-10-01"  # Example date string
date_format = "%Y-%m-%d"    # Input string format
birthday = datetime.strptime(date_string, date_format) 
turn_of_the_century = datetime.strptime('2000-01-01', date_format)

database = PostgresDatabase("")

if birthday < turn_of_the_century:
    database = SqlServerDatabase("")

user = User(database=database)
user.get_details(user_id=1)

लाइन 6 (birthday < turn_of_the_century) पर, डिपेंडेंसी इंजेक्शन हमें विभिन्न स्थितियों के आधार पर आसानी से कार्यान्वयन बदलने की अनुमति देता है। जबकि यह लचीलापन प्रोडक्शन कोड के लिए मूल्यवान है, डिपेंडेंसी इंजेक्शन के सबसे सामान्य उपयोगों में से एक, विशेष रूप से स्टेटिक भाषाओं में, टेस्टिंग में है।

यहाँ एक उदाहरण है:

class UserTests(unittest.TestCase):
    def test_is_authenticated(self):
        database = MockDatabase('connection_string')
        
        is_authenticated = User(database).is_authenticated('user', 'pass')

        self.assertTrue(is_authenticated)

यह MockDatabase क्लास का उपयोग करते हुए एक सरल उदाहरण है। Python में, हम समान परिणाम प्राप्त करने के लिए बिल्ट-इन Mock क्लास का भी उपयोग कर सकते हैं।

दिलचस्प बात यह है कि जिन Python प्रोजेक्ट्स पर मैंने काम किया है, उनमें डिपेंडेंसी इंजेक्शन का व्यापक रूप से उपयोग नहीं किया गया था। स्टेटिक भाषा की पृष्ठभूमि से आने पर, मैं आश्चर्यचकित था— और यह प्रतिकूल लगा।

हालांकि, इस सीमित अपनाने का एक कारण है। Python की बिल्ट-इन पैच कार्यक्षमता पहले से ही उत्कृष्ट टेस्टिंग क्षमताएं प्रदान करती है, जो डिपेंडेंसी इंजेक्शन के मुख्य लाभों में से एक को समाप्त कर देती है। जबकि डिपेंडेंसी इंजेक्शन अभी भी जटिलता को कम करने में मदद कर सकता है, Python के पास समान लक्ष्य प्राप्त करने के लिए अन्य दृष्टिकोण हैं।

मैं यह नहीं कह रहा कि Python में डिपेंडेंसी इंजेक्शन का उपयोग नहीं किया जाना चाहिए। बल्कि इसके विपरीत, सभी उपकरणों और पैटर्न की तरह, उनका उपयोग करने का एक स्थान और समय है। और डिपेंडेंसी इंजेक्शन आपके टूल बेल्ट में सिर्फ एक और उपकरण है जो आपके कोड की गुणवत्ता में सुधार करेगा।

मुझे लगता है कि डिपेंडेंसी इंजेक्शन आम तौर पर अधिकांश Python प्रोजेक्ट्स में कोड गुणवत्ता बढ़ाएगा।

यदि आप डिपेंडेंसी इंजेक्शन को और अधिक एक्सप्लोर करने में रुचि रखते हैं, तो मैं दो लोकप्रिय Python फ्रेमवर्क देखने की सिफारिश करता हूं:

  • Injector (github.com/python-injector/injector)
  • Dependency Injector (python-dependency-injector.ets-labs.org)

लेखक: चक कॉनवे सॉफ्टवेयर इंजीनियरिंग और जेनेरेटिव AI में विशेषज्ञता रखते हैं। उनसे सोशल मीडिया पर जुड़ें: X (@chuckconway) या उन्हें YouTube पर देखें।

↑ शीर्ष पर वापस

आपको यह भी पसंद आ सकता है