Why does python dict behave this way? -


मेरे पास कुछ कोड लिखे हैं जैसे:

  class आमंत्रित करें (models.Model): STATE_UNKNOWN = 0 STATE_WONT_PLAY = 1 STATE_READY = 3 STATE_CHOICES = ((STATE_UNKNOWN, _ ("अज्ञात")), (STATE_WILL_PLAY, _ ("हाँ, मैं खेलूँगा")), (STATE_WONT_PLAY, _ ("क्षमा करें, ) ()), (STATE_READY, _ ("मैं अब खेलने के लिए तैयार हूँ")) ... def change_state (स्वयं, राज्य): जोर देकर कहते हैं (राज्य में (निमंत्रण। STATE_CHOICES))   

यह कोड काम करता है जैसे मैं चाहता हूं, लेकिन मैं उत्सुक हूं कि यह इस तरह से काम क्यों करता है। यह स्पष्ट रूप से बहुत सुविधाजनक है कि यह इस तरह से काम करता है, लेकिन ऐसा लगता है कि शायद मैं कुछ अंतर्निहित दर्शन को याद कर रहा हूं कि ऐसा क्यों है।

अगर मैं कुछ ऐसा करने की कोशिश करता हूं:

  dict ((1,2,3), (2,2,3), (3,2,3)) मान त्रुटि: शब्दकोश अद्यतन अनुक्रम तत्व # 0 की लंबाई 3 है; 2  
  {1: (2,3), 2: (2,3) की तरह लग रहा है ऐसा लगता नहीं है   

, 3: (2,3)}

तो सामान्य पैटर्न को ट्यूपल के पहले हिस्से को कुंजी के रूप में नहीं लेना चाहिए और शेष को मूल्य के रूप में रखना चाहिए। क्या यह कुछ बुनियादी आधार है जो इस व्यवहार का कारण बनता है, या यह सिर्फ ठीक है, यह सुविधाजनक होगा यदि यह किया हो।

मुझे लगता है कि यह कुछ हद तक स्पष्ट है। आपके उदाहरण में, (1,2,3) एक ही वस्तु है तो एक शब्दकोश के पीछे का विचार है कि कुंजी को एक मान (यानी ऑब्जेक्ट) को मैप करने के लिए।

तो आउटपुट पर विचार करें: < > <कोड> & gt पूर्व; & gt; & gt; ((1, (2, 3)), (2, (2, 3))) / कोड>

लेकिन आप ऐसा कुछ भी कर सकते हैं:

  & gt; & gt; & gt; डिक्ट ((((1,2), 3), ((2, 2), 3))) [((1, 2), 3), ((2, 2), 3)]  < / Pre> 

जहां कुंजी वास्तव में भी एक वस्तु है! इस मामले में एक ट्यूपल भी है।

तो आपके उदाहरण में:

  dict ((1,2,3), (2,2,3), (3, 2,3))   

आप कैसे जानते हैं कि प्रत्येक ट्यूपल का कौन सा हिस्सा महत्वपूर्ण है और कौन सा मूल्य है?

यदि आपको यह परेशान है, तो यह एक सरल अपने खुद के कन्स्ट्रक्टर को लिखना ठीक करें:

  डीईएफ़ स्पेशल_डिक्ट (* आर्ग्स): वापसी डिक्ट ((आरजीआर [0], आरजीआर [1:]) आरजीआर में आरजीआर के लिए)   

इसके अलावा, राफी की टिप्पणी के लिए, आपको तुरंत शब्दकोश परिभाषित करना चाहिए:

  वर्ग आमंत्रित करें (models.Model): STATE_UNKNOWN = 0 STATE_WILL_PLAY = 1 STATE_WONT_PLAY = 2 STATE_READY = 3 STATE_CHOICES (STATE_UNKNOWN, _ ("अज्ञात"), (STATE_WILL_PLAY, _ ("हाँ, मैं खेलूंगा")), (STATE_WONT_PLAY, _ ("क्षमा करें, नहीं चला सकता")), (STATE_READY, _ ("मैं अब खेलने के लिए तैयार हूं"))) ... def change_state (स्वयं, राज्य): जोर देकर (आमंत्रण में राज्य। STATE_CHOICES)   

यदि आप कभी भी चाहते हैं राज्यों पर फिर से चलना, आपको बस इतना करना है: राज्य के लिए

 , वर्णन = आमंत्रित करें। STATE_CHOICES.iteritems (): प्रिंट "{0} == {1}"।   

अपने change_state फ़ंक्शन में डिक्शनरी का निर्माण अनावश्यक रूप से महंगा है।

जब आप डीजेंगो फ़ील्ड को परिभाषित करते हैं , बस करो:

  मॉडल.इटेगरफिल्ड (सॉर्ट किया गया (विकल्प = आमंत्रित करें। STATE_CHOICES.iteritems ()))    

Comments

Popular posts from this blog

qt - switch/case statement in C++ with a QString type -

python - sqlite3.OperationalError: near "REFERENCES": syntax error - foreign key creating -

Python's equivalent for Ruby's define_method? -