2011-08-03 15 views
8

पायथन के intern केवल तारों के लिए अंतर्निहित क्यों है? intern को कक्षाओं में विस्तारित करना संभव है जो तुलनात्मक और तुलनीय हैं, है ना?गैर-तारों के लिए पायथन इंटर्न

+1

आप अपरिवर्तनीय वस्तुओं के लिए 'intern' जैसे ऑब्जेक्ट कैश बना सकते हैं। –

+0

@ पीटर: आप सही हैं। 'Intern' का लाभ यह है कि उसके लिए सभी कोड स्वचालित रूप से जेनरेट किए जाते हैं, और बोनस के रूप में, यह तेज़ सी ++ में होता है। –

+2

@NeilG मुझे ऐसा नहीं लगता है। AFAIK CPython पूरी तरह से सी में लिखा गया है, सी ++ नहीं। – glglgl

उत्तर

14

चीजों को प्रशिक्षित करने का उद्देश्य उनके स्मृति पते की तुलना करके उनकी तुलना करने में सक्षम होना है; आप सुनिश्चित करते हैं कि आप कभी भी एक ही मान के साथ दो ऑब्जेक्ट्स नहीं बनाते (जब प्रोग्राम किसी ऑब्जेक्ट को किसी मौजूदा ऑब्जेक्ट के समान मान के साथ अनुरोध करता है, तो इसके बजाय इसे पूर्व-मौजूदा ऑब्जेक्ट का संदर्भ प्राप्त होता है)। इसकी आवश्यकता है कि जिन चीजों को आप इंटर्न कर रहे हैं वे अपरिवर्तनीय; यदि एक इंटर्न ऑब्जेक्ट का मूल्य बदल सकता है, तो पते से उनकी तुलना करना काम नहीं करेगा।

पायथन में, उपयोगकर्ता द्वारा परिभाषित कक्षा के उदाहरणों की अपरिवर्तनीयता को लागू करना संभव नहीं है, इसलिए उन्हें प्रशिक्षित करना सुरक्षित नहीं होगा। मुझे संदेह है कि मुख्य सैद्धांतिक कारण इंटर्न कक्षा के उदाहरणों को कवर नहीं करता है।

अन्य अपरिवर्तनीय प्रकार में बनाया गया एक भी मशीन-स्तरीय संचालन पहले से ही (int, नाव, आदि), या अपरिवर्तनीय कंटेनरों कि परिवर्तनशील मूल्यों (टपल, frozenset) शामिल कर सकते हैं या तो तुलना के योग्य हैं। पूर्व को प्रशिक्षित करने की कोई आवश्यकता नहीं है, और बाद वाले को सुरक्षित रूप से प्रशिक्षित नहीं किया जा सकता है।

+0

+1। "पायथन में, उपयोगकर्ता परिभाषित वर्ग के उदाहरणों की अपरिवर्तनीयता को लागू करना संभव नहीं है" - कितना दुर्भाग्यपूर्ण है। – ShreevatsaR

0

केवल स्ट्रिंग समर्थित हैं क्योंकि इंटर्निंग पॉइंटर-आधारित object identity test पर निर्भर करती है। अन्य प्रकार के वर्गों के हेशों की तुलना की जा सकती है, लेकिन ऑब्जेक्ट्स स्वयं कभी पहचान परीक्षण से मेल नहीं खाएंगे। यह सच है क्योंकि भले ही वे समान हो, वे एक ही वस्तु नहीं हैं।

Reference

+3

जैसा कि मैं इसे समझता हूं, पॉइंटर-आधारित ऑब्जेक्ट पहचान परीक्षण * लाभ * है जो आपको इंटर्निंग द्वारा प्राप्त होता है, न कि चीजों को प्रशिक्षित करने के लिए आवश्यक है। यदि आप इंटर्न ऑब्जेक्ट्स से पूछ रहे हैं, तो आप मूल रूप से एक ही पहचान के समान मूल्य वाले किसी भी विचार पर विचार कर रहे हैं (जो मुझे विश्वास है कि नील जी क्या है जब वह "हैशबल और तुलनीय" कहता है)। बदले में यह आवश्यक है कि वे अपरिवर्तनीय हैं, जो पाइथन में कक्षा के उदाहरणों की प्रवर्तन योग्य संपत्ति नहीं है। मुझे लगता है कि यह मुख्य सैद्धांतिक कारण है कि यह समर्थित नहीं है। – Ben

+0

@ बेन: यह मेरे प्रश्न की एक अच्छी व्याख्या है। साथ ही, आपका अंतिम बिंदु शायद इस प्रश्न का उत्तर है। एक उत्तर जोड़ने के लिए स्वतंत्र महसूस करें। –

1

कोई तकनीकी कारण यह है कि, कहते हैं, एक टपल प्रशिक्षु नहीं किया जा सका है, हालांकि मुझे लगता है कि कल्पना कर सकते हैं असली दुनिया इस स्ट्रिंग शाब्दिक की तुलना में कम मूल्य की है, और यह भी की होगी नहीं है उपयोगकर्ता द्वारा परिभाषित प्रकारों के साथ कम असली दुनिया मूल्य। इसे काम करना संभवतः प्रयास के लायक नहीं माना जाता है।

+5

एक ट्यूपल की सामग्री उत्परिवर्तनीय हो सकती है। आंतरिक tuples अजीब व्यवहार का कारण बन सकता है। जैसे 'ए, बी = ([]), ([]); एक [0] .append ('foo') 'के आधार पर अलग-अलग परिणाम होंगे कि 'ए' और' बी' अलग-अलग tuples थे जो ट्यूपल इंटर्निंग कार्यान्वयन पर निर्भर करता है। स्पष्ट रूप से फोरट्रान के कुछ कार्यान्वयन [कुछ ऐसा ही किया] [http://stackoverflow.com/questions/1995113/strangest-language-feature/1995476#1995476)। –

+2

@ पीटर: इंटर्निंग का पूरा विचार यह है कि आप इसे तब ही कर सकते हैं जब आपके द्वारा वर्णित कोई दुष्प्रभाव नहीं होता है। एक ट्यूपल को आंतरिक रूप से यह सुनिश्चित करने के लिए जांचना होगा कि सभी तत्व एक ही ऑब्जेक्ट्स हैं जो पहले से ही प्रशिक्षित टुपल के समान हैं, न केवल बराबर। यह वास्तव में तत्वों को पहले प्रशिक्षित करने का प्रयास कर सकता है (यदि संख्यात्मक प्रकार भी इंटर्न करने योग्य होते हैं तो यह अधिक उपयोगी होगा)। आपके उदाहरण में, टुपल्स बस एक संदर्भ साझा करने में सक्षम नहीं होंगे अगर उनमें एक ही सूची नहीं थी। कोई तकनीकी कारण नहीं है कि इस सब कुछ करने के लिए पायथन को संशोधित नहीं किया जा सका। – kindall

संबंधित मुद्दे