क्यों अजगर शब्दकोशों python3.7 के लिए प्रतिवर्ती नहीं हैं?


11

3.7 से शुरू, प्रविष्टि आदेश को बनाए रखने के लिए मानक अजगर शब्दकोशों की गारंटी है। (*)

d = {'b': 1, 'a': 2}
for k in d: 
    print(k)
# Prints always 'b' before 'a'.

दूसरे शब्दों में, सख्त कुंजी को सख्त क्रम में रखा जाता है। सिद्धांत रूप में, यह कुंजी को प्रतिवर्ती होने की अनुमति देगा। हालाँकि, निम्न में से कोई भी काम नहीं करता है:

# TypeError: 'dict' object is not reversible
for k in reversed(d): 
    print(k)

# TypeError: 'dict_keys' object is not reversible
for k in reversed(d.keys()): 
    print(k)

प्रश्न: इस व्यवहार के पीछे क्या कारण है? क्यों डाइक को प्रतिवर्ती नहीं बनाया गया है? क्या भविष्य में इस व्यवहार को बदलने की कोई योजना है?

बेशक काम करता है:

for k in reversed(list(d.keys())): 
    print(k)

(*) इस तथ्य के रूप में, यह पहले से ही अजगर 3.6 के विशिष्ट प्रतिष्ठानों के लिए मामला है, जैसा कि इस पोस्ट में चर्चा की गई है ।


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

जवाबों:


5

से डॉक्स :

उलट ( seq )

एक उलटा लौटाओ iterator। seq एक ऑब्जेक्ट होना चाहिए जिसमें एक __reversed__()विधि है या अनुक्रम प्रोटोकॉल का समर्थन करता है ( __len__()विधि और __getitem__()पूर्णांक तर्कों के साथ विधि 0 से शुरू होती है)।

कोई dictऑब्जेक्ट कार्यान्वित नहीं होता है __reversed__। यह बाद के दोनों तरीकों को लागू करता है। हालाँकि, __getitem__पूर्णांक के बजाय तर्क के रूप में कुंजी लेता है (0 पर शुरू)।

क्यों, यह पहले से ही यहां पर सुझाव दिया गया है और चर्चा की गई है

संपादित करें:

ये उद्धरण पायथन-देव मेलिंग सूची से हैं (सूत्र "तानाशाही के लिए __reversed__ तरीके जोड़ें", 25 से शुरू हुआ। 05. 18), मैं "वैचारिक" तर्कों के साथ शुरू करूंगा, पहले एक एंटोनी पिट्रू से है:

यह कुछ भी नहीं लायक है कि ऑर्डरडीडक्ट पहले से ही उलट () का समर्थन करता है। तर्क दोनों तरीकों से जा सकता है:

  1. तानाशाह आजकल ऑर्डरडीक के समान है, इसलिए इसे उल्टा () भी समर्थन करना चाहिए;

  2. आप ऑर्डर करने के लिए ऑर्डर करने के बारे में स्पष्ट रूप से संकेत देने के लिए ऑर्डरडीडक्ट का उपयोग कर सकते हैं; तानाशाही में कुछ जोड़ने की जरूरत नहीं।

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

रेमंड हेटिंगर के जवाब के बाद:

यह देखते हुए कि डक्ट्स अब प्रविष्टि आदेश को ट्रैक करते हैं, यह सबसे हालिया सम्मिलन (यानी एक कार्य में सबसे हाल ही में जोड़े गए कार्यों पर लूपिंग) को जानना चाहता है। अन्य संभावित उपयोग के मामलों की संभावना होगी कि हम यूनिक्स पूंछ कमांड का उपयोग कैसे करें।

यदि उन उपयोग के मामले सामने आते हैं, तो __reversed__ को पहले से ही समर्थित होने के लिए अच्छा होगा ताकि लोग पॉपिटेम () कॉल का उपयोग करके एक बदसूरत वर्कअराउंड को लागू करने के लिए लुभा न सकें।

मेलिंग लिस्ट में मुख्य चिंता यह थी कि इससे बहुत अधिक ब्लोट जुड़ जाएगा या कम से कम कुछ कार्यान्वयन में मेमोरी दक्षता (एकल लिंक किए गए लोगों की बजाय दोगुनी लिंक की गई सूची) को कम करने के लिए, यहाँ पायथिया बग ट्रैकर से इनाडा नोकी की बोली ( अंक 33462) ):

"एक आदेश है" का अर्थ "प्रतिवर्ती" नहीं है। उदाहरण के लिए, एकल लिंक्ड सूची का आदेश दिया गया है, लेकिन प्रतिवर्ती नहीं।

जबकि सीपीथॉन कार्यान्वयन कुशल प्रदान कर सकता है __reverse__, __reverse__इसका मतलब है कि सभी पायथन कार्यान्वयन इसे प्रदान करने की उम्मीद है। उदाहरण के लिए, कुछ पायथन कार्यान्वयन होशमैप + एकल लिंक की गई सूची के साथ बड़े पैमाने पर लागू करने में सक्षम हो सकते हैं। अगर __reverse__जोड़ा जाता है, तो यह अब संभव नहीं है।

मेलिंग सूची पर वापस, यहाँ दो अंतिम संदेश हैं (दोनों 08.06.2018 को पोस्ट किए गए हैं)। पहले माइकल सेलिक से है:

क्या मैं यह कहने में सही हूं कि आम सहमति v3.8 में शामिल करने के लिए +1 है?

धागे में अंतिम बिंदु ईनाडा नोकी था जिसने विभिन्न कार्यान्वयनों पर शोध किया और निर्णय लिया कि इस सुविधा को 3.8 में शामिल करना ठीक है। जैसा कि मैं इसे समझता हूं, गुइडो ने माइक्रोएथन के v3.7 के कार्यान्वयन की प्रतीक्षा करने के लिए ईनाडा की सलाह के साथ समझौता किया था। जब से आईएनएडीए ने मन बदला है, मैं अनुमान लगा रहा हूं कि यह सब पक्ष में है?

गुइडो वैन रोसुम के संदेश के साथ समापन:

यह मुझे सही लगता है। फिर हमारे पास दो संस्करण होंगे जहां यह मामला था:

  • 3.6 जहां ऑर्डर संरक्षण को सीपीथॉन में लागू किया गया था, लेकिन भाषा की कल्पना में

  • ३. it जहाँ इसे भाषा की युक्ति से भी जोड़ा गया था

जैसा कि अन्य उत्तर और टिप्पणियों में उल्लेख किया गया है, reversed()संस्करण 3.8 (14.10.2018) के बाद से डिक्ट्स और तानाशाही दोनों के लिए समर्थित है।


5
आपका दूसरा उद्धरण उस धागे से एक पूर्वाग्रह चयन जैसा लगता है। सर्वसम्मति से लगता है कि कार्यक्षमता 3.8 में जोड़ी जाएगी। इसके अलावा अजगर 3.7 से पहले बस एक सामान्य dictवस्तु पर कोई आदेश नहीं था (कम से कम भाषा से गारंटी नहीं है) इसलिए reversedभी कोई मतलब नहीं था
फ्लाइंगटेलर

मेरे पास लड़ाई में एक कुत्ता नहीं है, मैंने सिर्फ अपनी पहली प्रतिक्रिया दी है। लेकिन तुम सही हो, अच्छी तरह से बात की - मैंने बोली हटा दी।
gst

1
धन्यवाद। अजगर-देव की चर्चा धागा प्रकट कर रही थी। तथ्य की बात के रूप में, सुविधा पहले से ही 3.8 में लागू की गई है, जिसे अभी दो दिन पहले (14 अक्टूबर 2019) जारी किया गया था।
मानदंड


डॉक्स उद्धरण मददगार नहीं है, यह केवल अगले सवाल को जन्म देता है "तो, तानाशाही प्रकार क्यों लागू नहीं होता है __reversed__"? अजगर-देव लिंक में उपयोगी सामग्री है, लेकिन संबंधित भागों को सीधे उत्तर में पुन: प्रस्तुत किया जाना चाहिए (क्योंकि इस तरह के ऑफ-साइट लिंक सड़ जाते हैं)।
विम

3

चूंकि अजगर पर 3.8 रिवर्स () प्रयोग करने योग्य है

डिक्ट और तानाशाही अब उलट () का उपयोग करके उलटा सम्मिलन क्रम में चलने योग्य हैं। (बीपीओ -३३४६२ में रेमी लापेरे द्वारा योगदान दिया गया।)


1

अजगर 3.8 के लिए अद्यतन

अब उलटे सम्मिलन क्रम में उलट का उपयोग करते हुए निर्णय और तानाशाही चलने योग्य हैं ()

>>> dict = {1: "1", 2: "2", 3: "3"}
>>> reversed(dict)
<dict_reversekeyiterator object at 0x7f72ca795130>

क्या यह उत्तर कुछ भी नया योगदान देता है जो पहले से ही अन्य उत्तरों, टिप्पणियों या स्वयं प्रश्न द्वारा कवर नहीं किया गया है?
11

@normanius इसमें एक lil दृश्य कोड नमूना है, जो त्वरित ब्राउज़र के लिए मददगार हो सकता है
jamylak
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.