Skip to content

पोस्ट

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

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

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

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

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

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

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

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

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

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

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

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

# 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 एब्सट्रैक्शन के साथ ढीली रूप से जुड़ी हुई है। हम Database एब्सट्रैक्शन का एक अलग कार्यान्वयन User क्लास में पास कर सकते हैं।

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

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 क्लास का उपयोग करके एक सरल उदाहरण है। पायथन में, हम समान परिणाम प्राप्त करने के लिए बिल्ट-इन Mock क्लास का भी उपयोग कर सकते हैं।

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

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

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

मुझे लगता है कि डिपेंडेंसी इंजेक्शन आम तौर पर अधिकांश पायथन प्रोजेक्ट्स में कोड की गुणवत्ता में वृद्धि करेगा।

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

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

लेखक: Chuck Conway एक AI इंजीनियर हैं जिनके पास सॉफ्टवेयर इंजीनियरिंग का लगभग 30 साल का अनुभव है। वह व्यावहारिक AI सिस्टम बनाते हैं—कंटेंट पाइपलाइन, इंफ्रास्ट्रक्चर एजेंट, और ऐसे टूल जो वास्तविक समस्याओं को हल करते हैं—और अपनी सीख को साझा करते हैं। सोशल मीडिया पर उनसे जुड़ें: X (@chuckconway) या YouTube और SubStack पर उनसे मिलें।

↑ शीर्ष पर वापस जाएं

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