प्रतिनिधि इंटरव्यू विषय

कोडिंग इंटरव्यू: आप बिना अनपेक्षित मूल्यांकन (accidental evaluation) के Python 3.14 एनोटेशन का इंट्रोस्पेक्शन कैसे करेंगे?

कोडिंगकठिन
Offer.cc संपादकीय टीमप्रकाशित अपडेट किया गया

प्रश्न

एक प्लगइन लोडर स्कीमा बनाने के लिए फ़ंक्शन एनोटेशन का निरीक्षण करता है। Python 3.14 में अपग्रेड करने के बाद, कुछ एनोटेशन वैकल्पिक मॉड्यूल इम्पोर्ट करते हैं या अनसुलझे (unresolved) नामों पर विफल हो जाते हैं। आप इंट्रोस्पेक्शन को कैसे फिर से डिज़ाइन करेंगे ताकि डिस्कवरी अनुमानित और सुरक्षित हो?

प्रॉम्प्ट और दायरा

Python 3.14 मूल्यांकन के डेफर्ड (deferred) होने पर एनोटेशन प्राप्त करने के लिए annotationlib जोड़ता है। लोडर को फॉरवर्ड संदर्भों का समर्थन करना चाहिए, डिस्कवरी के दौरान मनमाने एनोटेशन एक्सप्रेशन्स को निष्पादित करने से बचना चाहिए, और पुराने Python वर्शनों के लिए अनुकूलता (compatibility) पथ प्रदान करना चाहिए। मुख्य कौशल रनटाइम इंट्रोस्पेक्शन और साइड-इफेक्ट नियंत्रण है, इसलिए यह एक coding प्रश्न है।

इंटरव्यूअर क्या आंकते हैं

मजबूत उत्तर एनोटेशन प्राप्त करने और उनका मूल्यांकन करने के बीच अंतर स्पष्ट करते हैं। वे उपभोक्ता के आधार पर VALUE, FORWARDREF, या STRING चुनते हैं, विफलताओं को अलग (isolate) करते हैं, और यह परिभाषित करते हैं कि विश्वसनीय कोड का मूल्यांकन कब किया जा सकता है। वे प्राइवेट इंटरप्रेटर विशेषताओं पर भरोसा करने के बजाय कैश अमान्यकरण (invalidation), मॉड्यूल रीलोड, नेस्टेड टाइप एलियास और एक वर्शन-आधारित फॉलबैक को भी संबोधित करते हैं।

पहले स्पष्ट करने योग्य प्रश्न

  • क्या लोडर विश्वसनीय एप्लिकेशन कोड का निरीक्षण कर रहा है या तीसरे पक्ष के प्लगइन्स का?
  • क्या स्कीमा जनरेटर को रनटाइम ऑब्जेक्ट्स, स्ट्रिंग्स या अनसुलझे संदर्भों की आवश्यकता है?
  • किन Python वर्शनों का समर्थन जारी रहना चाहिए?
  • क्या एनोटेशन एक्सप्रेशन्स को मॉड्यूल इम्पोर्ट करने या फ़ंक्शन कॉल करने की अनुमति है?
  • प्लगइन रीलोड होने के बाद विफलताओं की रिपोर्ट, कैशिंग और पुनः प्रयास कैसे किया जाता है?
  • क्या एनोटेशन डेटा सार्वजनिक संगतता अनुबंध (compatibility contract) का हिस्सा है?

30-सेकंड उत्तर ढांचा

“मैं ऐसे हेल्पर को कॉल करना बंद कर दूंगा जो हमेशा एनोटेशन का मूल्यांकन करता है। Python 3.14 पर मैं गैर-भरोसेमंद डिस्कवरी के लिए Format.FORWARDREF या Format.STRING के साथ annotationlib.get_annotations() का उपयोग करूंगा, और एक स्पष्ट विश्वसनीय चरण के लिए Format.VALUE आरक्षित रखूंगा। मैं परिणामों को एक आंतरिक स्कीमा में सामान्यीकृत करूंगा, प्रति-ऑब्जेक्ट विफलताओं को अलग करूंगा, और पुराने Python के लिए एक वर्शन-गेटेड फॉलबैक रखूंगा। परीक्षणों में फॉरवर्ड संदर्भ, वैकल्पिक इम्पोर्ट, नेस्टेड एलियास, रीलोड और निश्चित त्रुटि रिपोर्टिंग शामिल होंगे।”

चरण-दर-चरण उत्तर

चरण 1: डिस्कवरी को मूल्यांकन से अलग करें

दो चरणों को परिभाषित करें: डिस्कवरी बिना रिज़ॉल्व किए नामों या ForwardRef ऑब्जेक्ट्स को रिकॉर्ड करती है; रेज़ोल्यूशन केवल स्वीकृत मॉड्यूल और प्रतीकों के लिए चलता है। यह स्कीमा डिस्कवरी को केवल एनोटेट होने के कारण वैकल्पिक निर्भरताओं को इम्पोर्ट करने या किसी एक्सप्रेशन को निष्पादित करने से रोकता है।

चरण 2: एनोटेशन फॉर्मेट का चयन करें

जब स्कीमा को सोर्स जैसे टेक्स्ट की आवश्यकता हो तो Format.STRING का उपयोग करें, जब अनसुलझे नामों को संरचित रहना हो तो Format.FORWARDREF का, और केवल तभी Format.VALUE का जब रनटाइम ऑब्जेक्ट्स की आवश्यकता हो और मूल्यांकन विश्वसनीय हो। फॉर्मेट के चयन को लोडर के API अनुबंध के हिस्से के रूप में मानें।

चरण 3: विफलताओं और साइड-इफेक्ट्स को नियंत्रित करें

प्रति कॉलेबल या क्लास रेज़ोल्यूशन त्रुटियों को पकड़ें, डायग्नोस्टिक्स में ऑब्जेक्ट पाथ और फॉर्मेट जोड़ें, और स्वतंत्र प्लगइन्स की डिस्कवरी जारी रखें। किसी अनसुलझे संदर्भ को चुपचाप Any में परिवर्तित न करें; यह संगतता दोषों को छुपाता है। इम्पोर्ट्स या प्रतीकों का मूल्यांकन करने से पहले एक अनुमति सूची (allowlist) लागू करें।

चरण 4: वर्शनयुक्त अनुकूलता जोड़ें

Python 3.14+ पर, प्रलेखित annotationlib API का उपयोग करें। पुराने वर्शनों पर, प्रोजेक्ट की मौजूदा संगतता परत का उपयोग करें और इसकी कमजोर गारंटियों का दस्तावेजीकरण करें। दीर्घकालिक इंटरफ़ेस के रूप में प्राइवेट __annotate__ या इंटरप्रेटर के आंतरिक घटकों से बचें।

चरण 5: नियतत्ववाद (determinism) और जीवनचक्र का परीक्षण करें

ऐसे एनोटेशन का परीक्षण करें जो बाद की परिभाषाओं, अनुपलब्ध मॉड्यूल, नेस्टेड जेनेरिक एलियास, स्ट्रिंग्स और मॉड्यूल रीलोड को संदर्भित करते हैं। सत्यापित करें कि डिस्कवरी अवरुद्ध मॉड्यूल को इम्पोर्ट नहीं करती है, बार-बार पढ़ने पर वही सामान्यीकृत स्कीमा उत्पन्न होता है, और प्लगइन पहचान या स्रोत बदलने पर कैश अमान्य हो जाता है।

मॉडल उत्तर

“यह बग एक चरण उल्लंघन (phase violation) है: डिस्कवरी उस डेटा का मूल्यांकन कर रही है जिसे केवल स्कीमा का वर्णन करना चाहिए। मैं Python 3.14 के प्रलेखित annotationlib API का उपयोग करूंगा, गैर-भरोसेमंद निरीक्षण के लिए STRING या FORWARDREF का चयन करूंगा और केवल एक स्पष्ट विश्वसनीय रिज़ॉल्वर में VALUE का उपयोग करूंगा। प्रत्येक ऑब्जेक्ट को अलग डायग्नोस्टिक्स मिलते हैं, अनसुलझे संदर्भ दृश्यमान रहते हैं, और एक अनुमति सूची मूल्यांकन को नियंत्रित करती है। एक वर्शन एडेप्टर पुराने Python व्यवहार को संरक्षित करता है। परीक्षणों में फॉरवर्ड संदर्भ, अनुपलब्ध वैकल्पिक मॉड्यूल, एलियास, रीलोड, साइड-इफेक्ट इम्पोर्ट्स और स्थिर सामान्यीकृत आउटपुट शामिल हैं।”

सामान्य गलतियाँ

  • हमेशा एनोटेशन का मूल्यांकन करना → डिस्कवरी के दौरान वैकल्पिक इम्पोर्ट और एक्सप्रेशन्स चलते हैं → फॉर्मेट और चरणों को अलग करें।
  • विफलताओं को Any में बदलना → स्कीमा ड्रिफ्ट अदृश्य हो जाता है → अनसुलझे संदर्भों और डायग्नोस्टिक्स को बनाए रखें।
  • प्राइवेट इंटरप्रेटर फ़ील्ड का उपयोग करना → अपग्रेड से लोडर टूट जाता है → प्रलेखित annotationlib पर निर्भर रहें।
  • एक ही ग्लोबल कैश साझा करना → रीलोड करने पर पुराने स्कीमा वापस आते हैं → प्लगइन पहचान और स्रोत द्वारा कुंजी बनाएं और अमान्य करें।
  • पूर्ण विशेषाधिकारों के साथ प्रत्येक प्लगइन को रिज़ॉल्व करना → गैर-भरोसेमंद कोड में साइड इफेक्ट उत्पन्न होते हैं → एक अनुमति सूची और विश्वसनीय चरण का उपयोग करें।
  • केवल सरल बिल्ट-इन्स का परीक्षण करना → प्रोडक्शन में फॉरवर्ड संदर्भ विफल हो जाते हैं → अनुपलब्ध नाम और नेस्टेड एलियास शामिल करें।

फॉलो-अप प्रश्न

फॉलो-अप 1: VALUE कब उपयुक्त है?

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

फॉलो-अप 2: स्ट्रिंग्स के बजाय FORWARDREF क्यों रखें?

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

फॉलो-अप 3: Python 3.14 में क्या बदलाव होता है?

एनोटेशन डिफ़ॉल्ट रूप से डेफर्ड होते हैं, और annotationlib उन्हें प्राप्त करने के लिए प्रलेखित फॉर्मेट प्रदान करता है। जो कोड उत्सुक मूल्यांकन (eager evaluation) मानकर चलता था, उसे अपना वांछित फॉर्मेट परिभाषित करना होगा।

फॉलो-अप 4: आप पुराने वर्शनों का समर्थन कैसे करते हैं?

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

सार्वजनिक स्रोत

संबंधित प्रश्न

संबंधित इंटरव्यू टूल

कोडिंग प्रॉम्प्ट के लिए स्क्रीनशॉट का उपयोग करें

समस्या को कैप्चर करें, फिर क्रम से प्रतिबंधों (constraints), समाधान, कोड, एज केस और जटिलता पर काम करें।

टूल देखें