प्रॉम्प्ट और संदर्भ
आपकी टीम Python 3.14 में अपग्रेड कर रही है और टेक्स्ट को जोड़ने (joining) से पहले इंटरपोलेशन का निरीक्षण करना चाहती है। समझाएं कि एक t-string क्या उत्पन्न करती है, इसे कैसे ट्रैवर्स किया जाए, और टेम्पलेट API स्वचालित एस्केपिंग (automatic escaping) क्यों नहीं है।
PEP 750 Python 3.14 में टेम्पलेट स्ट्रिंग्स जोड़ता है। t"..." सीधे str उत्पन्न नहीं करता है; यह string.templatelib.Template उत्पन्न करता है, स्टैटिक सेगमेंट्स और इंटरपोलेशन ऑब्जेक्ट्स को बनाए रखता है ताकि कोई एप्लिकेशन जोड़ने से पहले प्रत्येक मान को मान्य (validate), एस्केप या रूपांतरित (transform) कर सके।
साक्षात्कारकर्ता क्या परीक्षण कर रहा है
f-string के तत्काल स्ट्रिंगिफिकेशन और एक संरचित t-string के बीच का अंतर, Template और Interpolation के फ़ील्ड्स, कच्चे मान (raw values) और फॉर्मेट स्पेक्स (format specs), संदर्भ-विशिष्ट एस्केपिंग, साइड-इफ़ेक्ट नियंत्रण, और पुराने Python वर्जन्स के साथ कम्पैटिबिलिटी को कवर करें।
30-सेकंड का उत्तर ढांचा
"मैं यह कहकर शुरुआत करूंगा कि t-string अपने आप में सुरक्षित आउटपुट नहीं है। यह स्टैटिक सेगमेंट्स और इंटरपोलेशन ऑब्जेक्ट्स को सुरक्षित रखता है ताकि एक रेंडरर कच्चे मान, एक्सप्रेशन टेक्स्ट, कन्वर्ज़न और फॉर्मेट स्पेक का निरीक्षण कर सके, फिर SQL-, HTML-, या लॉगिंग-विशिष्ट एन्कोडिंग लागू कर सके। मैं मान प्रकारों को प्रतिबंधित करूंगा, नेस्टेड टेम्पलेट्स, फॉर्मेट स्पेक्स, अपवादों (exceptions), और पुराने वर्ज़न के फ़ॉलबैक का परीक्षण करूंगा, और इसके गंतव्य पर अंतिम आउटपुट को फिर से मान्य करूंगा।"
चरण-दर-चरण गहन विश्लेषण
चरण 1: f-strings और t-strings की तुलना करें
एक f-string मूल्यांकित होती है और str में फॉर्मेट होती है, जिससे इसकी मध्यवर्ती संरचना समाप्त हो जाती है। एक t-string t प्रीफ़िक्स का उपयोग करती है और एक Template उत्पन्न करती है; स्टैटिक टेक्स्ट और इंटरपोलेशन तब तक अलग रहते हैं जब तक कोई रेंडरर उन्हें जोड़ नहीं देता।
चरण 2: मुख्य ऑब्जेक्ट्स को समझें
एक टेम्पलेट में स्ट्रिंग सेगमेंट्स और Interpolation ऑब्जेक्ट्स होते हैं। एक इंटरपोलेशन इसके मान, एक्सप्रेशन टेक्स्ट, कन्वर्ज़न मार्कर और फॉर्मेट स्पेक को रिकॉर्ड करता है, जिससे नीति (policy) को स्रोत और गंतव्य संदर्भ पर विचार करने की अनुमति मिलती है। इटरेशन का मतलब यह नहीं है कि परिणाम पहले से ही सुरक्षित है।
चरण 3: एक न्यूनतम प्रोसेसर लिखें
निम्नलिखित प्रोसेसर केवल संरचनात्मक ट्रैवर्सल को प्रदर्शित करता है; एक वास्तविक सिस्टम को अभी भी संदर्भ-विशिष्ट एन्कोडिंग की आवश्यकता होती है:
from string.templatelib import Template
def render_plain(template: Template) -> str:
parts = []
for item in template:
if isinstance(item, str):
parts.append(item)
else:
parts.append(str(item.value))
return "".join(parts)
message = t"Hello, {name}!"str(item.value) केवल एक प्लेन-टेक्स्ट उदाहरण के लिए उपयुक्त है। SQL, HTML, Shell, और लॉग्स को उनके अपने पैरामीटराइजेशन या एन्कोडिंग API की आवश्यकता होती है।
चरण 4: कन्वर्ज़न्स और फॉर्मेट स्पेक्स को संभालें
एक इंटरपोलेशन में !s, !r, या एक फॉर्मेट स्पेक हो सकता है। रेंडरर को यह तय करना चाहिए कि क्या कन्वर्ज़न की अनुमति है, फिर गंतव्य संदर्भ के लिए रूपांतरित मान को एन्कोड करना चाहिए। repr HTML एस्केपिंग नहीं है, और एक फॉर्मेट स्पेक को टाइप अनुमति सूची (type allowlist) को बायपास नहीं करना चाहिए।
चरण 5: साइड-इफ़ेक्ट एक्सप्रेशन्स से बचें
एक t-string अभी भी Interpolation ऑब्जेक्ट्स बनाने के लिए इंटरपोलेशन एक्सप्रेशन्स का मूल्यांकन करती है। प्रोसेसर कोई सैंडबॉक्स नहीं है; निर्माण के समय ही एक अविश्वसनीय टेम्पलेट जोखिम भरा होता है। प्लगइन्स या उपयोगकर्ता इनपुट के लिए, गतिशील रूप से निष्पादित एक्सप्रेशन्स के बजाय डेटा प्लेसहोल्डर्स स्वीकार करें।
चरण 6: आउटपुट संदर्भ के अनुसार नीति चुनें
प्लेन टेक्स्ट एक अनुमति-सूचीबद्ध कन्वर्ज़न का उपयोग कर सकता है; HTML को एक ऑडिट किए गए HTML एस्केपर की आवश्यकता होती है; SQL को ड्राइवर पैरामीटर बाइंडिंग की आवश्यकता होती है; Shell को कॉनकेटनेशन से बचना चाहिए और एक तर्क सरणी (argument array) का उपयोग करना चाहिए; संरचित लॉग्स में एक जुड़ी हुई लाइन के बजाय फ़ील्ड्स होने चाहिए। Template संरचना प्रदान करता है, ये सुरक्षा सीमाएं नहीं।
चरण 7: वर्जन्स का समर्थन करें और API खोजें
Python 3.14 string.templatelib प्रदान करता है। एक कम्पैटिबिलिटी लेयर को मौजूदा टेम्पलेट लाइब्रेरी का चयन करना चाहिए या पुराने वर्जन्स पर स्पष्ट रूप से f-strings पर फ़ॉलबैक करना चाहिए; इसे वहां इंटरपोलेशन संरचना को संरक्षित करने का दिखावा नहीं करना चाहिए। स्टार्टअप पर रनटाइम वर्ज़न की जांच करें और प्रत्येक समर्थित दुभाषिया (interpreter) पर CI चलाएं।
चरण 8: परीक्षण और निरीक्षण करें
स्टैटिक सेगमेंट्स, नेस्टेड t-strings, फॉर्मेट स्पेक्स, अपवादों, __format__ साइड इफेक्ट्स और बड़े टेम्पलेट्स का परीक्षण करें। संवेदनशील इंटरपोलेशन सामग्री को लॉग किए बिना अस्वीकृत मान प्रकारों और टेम्पलेट स्रोतों को रिकॉर्ड करें; आउटपुट पर संदर्भ-विशिष्ट सुरक्षा प्रतिगमन (security regressions) चलाएं।
ट्रेड-ऑफ़ और सीमाएं
संरचित प्रसंस्करण बनाम सरल संयोजन
संरचना तब मदद करती है जब किसी सीमा को ऑडिटिंग, स्थानीयकरण या कई आउटपुट लक्ष्यों की आवश्यकता होती है। एक बार की प्लेन-टेक्स्ट स्क्रिप्ट f-string के साथ सरल होती है। प्रत्येक स्ट्रिंग को टेम्पलेट पाइपलाइन के माध्यम से रखने के बजाय जोखिम और पुन: प्रयोज्यता द्वारा चुनें।
लचीला स्वरूपण बनाम पूर्वानुमेय प्रकार
मनमाने __format__ की अनुमति देना अभिव्यंजक है लेकिन साइड इफेक्ट्स और टाइप ड्रिफ्ट का परिचय देता है। एक साझा रेंडरर को प्रकारों, कन्वर्ज़न्स और फॉर्मेट स्पेक्स को प्रतिबंधित करना चाहिए और अस्वीकृत मानों के लिए निदान योग्य त्रुटियां लौटानी चाहिए।
टेम्पलेट ऑब्जेक्ट बनाम अंतिम स्ट्रिंग
एक Template एक नियंत्रित सीमा के अंदर उपयोगी है। अंतिम आउटपुट को भेजने, संग्रहीत करने या निष्पादित करने से पहले अभी भी गंतव्य-विशिष्ट सत्यापन की आवश्यकता होती है; यह पहले से एन्कोड किया गया सुरक्षा टोकन नहीं है।
विफलता अभ्यास और विकास योजना
HTML एस्केपिंग बायपास हो गई है
एक इंटरपोलेशन को एक कस्टम __str__ दें जो मार्कअप लौटाता है और सत्यापित करें कि सादा str कन्वर्ज़न सुरक्षित नहीं है। इसे संदर्भ एन्कोडिंग से बदलें और दुर्भावनापूर्ण-मान प्रतिगमन जोड़ें।
एक फॉर्मेट स्पेक अपवाद उठाता है
एक असमर्थित स्पेक और एक ऐसे ऑब्जेक्ट का उपयोग करें जिसका __format__ अपवाद उठाता है। आंशिक आउटपुट वापस करने के बजाय प्रोसेसर को इंटरपोलेशन की पहचान करनी चाहिए और रेंडर को अस्वीकार करना चाहिए।
एक पुराना दुभाषिया मॉड्यूल चलाता है
Python 3.13 पर वही मॉड्यूल शुरू करें। वर्ज़न चेकिंग को एक स्पष्ट त्रुटि उत्पन्न करनी चाहिए या प्रोडक्शन में सिंटैक्स विफलता को टालने के बजाय एक स्पष्ट कम्पैटिबिलिटी कार्यान्वयन का चयन करना चाहिए।
सामान्य गलतियाँ और फॉलो-अप
गलती 1: यह मान लेना कि t-strings स्वचालित रूप से एस्केप हो जाती हैं
फॉलो-अप: वे क्या हल करती हैं? वे संरचना को सुरक्षित रखती हैं ताकि नीति जोड़ने से पहले चल सके; SQL और HTML सुरक्षा अभी भी समर्पित API से संबंधित है।
गलती 2: यह मान लेना कि इंटरपोलेशन एक्सप्रेशन्स कभी नहीं चलते
फॉलो-अप: उनका मूल्यांकन कब किया जाता है? वे t-string का निर्माण करते समय चलते हैं, इसलिए एक अविश्वसनीय टेम्पलेट को इस सिंटैक्स से सैंडबॉक्सिंग प्राप्त नहीं होती है।
गलती 3: repr को सुरक्षित एन्कोडिंग के रूप में मानना
फॉलो-अप: क्यों नहीं? repr एक डिबगिंग प्रतिनिधित्व है और HTML, SQL, Shell, या लॉग-फ़ील्ड एन्कोडिंग नियमों की गारंटी नहीं देता है।
विस्तृत फॉलो-अप और मॉडल उत्तर
क्या t-strings को प्रत्येक f-string को बदलना चाहिए?
नहीं। संरचना केवल उन सीमाओं पर उपयोगी है जो जोड़ने से पहले इंटरपोलेशन का निरीक्षण या रूपांतरण करती हैं; साधारण प्लेन टेक्स्ट f-string बना रह सकता है।
आप एक SQL रेंडरर कैसे बनाएंगे?
SQL स्ट्रिंग उत्पन्न न करें। स्टैटिक सेगमेंट्स और मानों को ड्राइवर प्लेसहोल्डर्स में मैप करें, ड्राइवर के माध्यम से मानों को बाइंड करें, और केवल स्टेटमेंट संरचना का वर्णन करने के लिए टेम्पलेट का उपयोग करें।
आप पुराने Python वर्जन्स का समर्थन कैसे करते हैं?
रनटाइम की जाँच करें, 3.14 पर string.templatelib का उपयोग करें, और पुराने वर्जन्स पर मौजूदा कार्यान्वयन या स्पष्ट असमर्थित त्रुटि का उपयोग करें। समान सुरक्षा परीक्षण सूट के साथ सिमेंटिक अंतरों को सत्यापित करें।