2014-08-31 4 views
8

source code पर देखकर, ऐसा लगता है कि OrderedDict पायथन में लिखा गया है, जबकि defaultdict सी में है, लेकिन ऐसा लगता है कि यह बदल रहा है क्योंकि पाइथन 3.5 में एक कॉर्डर्डडिक्ट होना चाहिए (Python Bugs देखें), जो कि कितना बुरा दिखाता है वास्तव में मेरा एकमात्र स्पष्टीकरण है।ऑर्डर्ड डिक्ट को ऊंट मामले में क्यों नामित किया गया है जबकि डिफॉल्टडिक्ट कम मामला है?

क्या कोई बेहतर स्पष्टीकरण प्रदान कर सकता है? मुझे आशा है कि एक बेहतर कारण है।

संपादित: alleged duplicate जवाब अजगर 2.7 के लिए ठीक है, अजगर 3 के लिए नहीं है, जहां वर्ग/प्रकार भेद चला गया है।

>>> collections.defaultdict 
<class 'collections.defaultdict'> 
>>> collections.OrderedDict 
<class 'collections.OrderedDict'> 
+1

"अब जब कि वर्गों और प्रकार एकीकृत किए जाने की अपेक्षा की जाती है, सी प्रकार के लिए अजगर वर्गों के लिए केमलकेस और लोअरकेस के बीच अंतर frustratingly अजीब है।" - चिह्नित डुप्लिकेट में एक टिप्पणी से उपयोगकर्ता 2357112। – user2864740

+0

आपके "यह बदल रहा है" बिंदु को संबोधित करना: यह नहीं है कि पाइथन 3 सी कार्यान्वयन कैसे करता है। उदाहरण के लिए py3, आप 'पिकले आयात करें 'और यह प्रतिनिधि' आयात _ पिक्ले '- सी कार्यान्वयन - यदि उपलब्ध हो तो आयात करें। – roippi

+0

धन्यवाद, @roippi, मैं में पैच का जिक्र कर रहा था जिसे 'cOrderedDict' कहा जाता है। तथ्य यह है कि सी और पायथन संस्करण दोनों एक ही नाम के माध्यम से आयात किए जाएंगे अप्रासंगिक है। 'डिफॉल्टडिक्ट' और 'ऑर्डरर्ड डिक्ट'' के लिए नामकरण सम्मेलन अभी भी मेल नहीं खाएंगे। –

उत्तर

11

मैं अजगर-देव अभिलेखागार पर क्या मिल सकता के आधार पर, यह सिर्फ अपने स्वयं के दिशा निर्देशों का पालन नहीं devs के एक मामला है: OrderedDict और defaultdict दुभाषिया से ही दोनों माना वर्ग हैं।

गुइडो वास्तव में renaming defaultdict to DefaultDict सुझाव पीईपी की चर्चा है कि OrderedDict पेश किया दौरान यह असंगति ठीक करने के लिए:

वैसे भी, ऐसा लगता है विशेष रूप से संग्रह मॉड्यूल पहले से ही आंतरिक रूप से असंगत है - NamedTuple बनाम defaultdict। एक अर्थ में डिफॉल्टडिक्ट यहां अजीब है, क्योंकि ये कुछ मॉड्यूल से आयात करते हैं, वे अंतर्निहित नहीं हैं। शायद इसका नाम बदलकर NamedDict कर दिया जाना चाहिए?

ध्यान दें कि NamedDict गलत वर्तनी, he meant DefaultDict है:

> मुझे लगता है कि आप "DefaultDict" मतलब है।

हां, मैं विचलित हो गया हूं। :-(

मुझे यकीन है कि यह परिवर्तन क्यों (और अन्य मॉड्यूलों की इसी तरह के परिवर्तन, जैसे socket.socket, datetime.datetime), बनाया कभी नहीं किया गया था के बाद से गुइडो यह कर समर्थित नहीं हूँ।

विडंबना यह है कि

, (या शायद एलेक्स मार्टेली) जो नाम defaultdict के साथ आया था, तथ्य यह है कि वे एक आंतरिक वर्ग गूगल का उपयोग करते हुए DefaultDict बुलाया गया था पर यह आधारित थे के बावजूद:

गूगल एक DefaultDict कहा जाता है एक आंतरिक डेटा प्रकार जो 012,351,641 हो जाता हैनिर्माण पर एक डिफ़ॉल्ट मूल्य पारित किया। __getitem__ विधि, KeyError बढ़ाने के बजाय, दिए गए डिफ़ॉल्ट मान को मान में नहीं मिलता है जब मान नहीं मिलता है।

... स्निप ...

एलेक्स मार्टेली साथ दोपहर के भोजन के दौरान उन्होंने प्रस्ताव किया कि इस व्यवहार के साथ dict का एक उपवर्ग (लेकिन सी में लागू) भाषा के लिए एक अच्छा इसके अतिरिक्त होगा। ऐसा लगता है कि इसे लागू करना मुश्किल नहीं होगा।यह defaultdict नामित अंतर्निहित हो सकता है। कन्स्ट्रक्टर को पहला, आवश्यक, तर्क डिफ़ॉल्ट मान होना चाहिए। शेष तर्क (यहां तक ​​कि कीवर्ड तर्क) को कन्स्ट्रक्टर के लिए अपरिवर्तित किया गया है।

चर्चा जल्दी से किया जा रहा है defaultdict से चले गए एक अंतर्निहित यह collections मॉड्यूल का हिस्सा होने के लिए, लेकिन सभी लोअरकेस नाम अटक गया है। यह चर्चा 2006 में हुई थी, इसलिए पीईपी 8 तब तक कई सालों से आसपास रहा था। निश्चित नहीं है कि यह किसी के लिए कभी क्यों नहीं हुआ था कि उस समय इसे DefaultDict नाम दिया जाना चाहिए।

+0

मुझे पूरा यकीन है कि Google आंतरिक प्रकार पायथन में लागू किया गया था, इसलिए यह पायथन नामकरण सम्मेलन का उपयोग करेगा। – user2357112

+3

@ user2357112 एक ही धागे जहां 'OrderedDict' पर चर्चा की जा रही थी, (https://mail.python.org/pipermail/python-dev/2009-March/086639.html) समान सुझाव के जवाब में [गुइडो यह कहा] (है कि सी में लागू कक्षाएं सभी लोअरकेस में नाम दिया जाना चाहिए):।। * "तो फिर वे सब गलत हैं 3.0 में हम इस से अलग हो रहे हैं जैसे cPickle चला गया है, तो cStringIO है ** कार्यान्वयन भाषा चाहिए नहीं ** के माध्यम से चमक रहा है। \ * शायद \ * "में निर्मित स्थिति" पूंजीकरण, इसलिए केवल अंतर्निहित प्रकार के होते हैं मार्गदर्शन करना चाहिए लोअरकेस (str, int, dict आदि।)। "* – dano

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