जिसमें मैंने उस प्रश्न का उत्तर दिया जो पूछा गया था
अजगर बॉक्स से बाहर की पेशकश क्यों नहीं करता है?
मुझे संदेह है कि यह पायथन के ज़ेन के साथ करना है : "एक होना चाहिए - और अधिमानतः ऐसा करने के लिए केवल एक - स्पष्ट तरीका।" यह शब्दकोशों से मूल्यों तक पहुंचने के दो स्पष्ट तरीके पैदा करेगा: obj['key']
और obj.key
।
कैविट्स और नुकसान
इनमें कोड में स्पष्टता और भ्रम की संभावित कमी शामिल है। यानी, निम्नलिखित किसी और को भ्रमित कर सकता है जो बाद की तारीख में आपके कोड को बनाए रखने के लिए जा रहा है, या यहां तक कि आपके लिए, यदि आप थोड़ी देर के लिए इसमें वापस नहीं जा रहे हैं। ज़ेन से फिर से : "पठनीयता मायने रखती है!"
>>> KEY = 'spam'
>>> d[KEY] = 1
>>> # Several lines of miscellaneous code here...
... assert d.spam == 1
अगर d
तत्काल किया जाता है या KEY
परिभाषित किया जाता है या d[KEY]
जहां d.spam
इस्तेमाल किया जा रहा है, उससे बहुत दूर सौंपा गया है, तो यह आसानी से भ्रम में डाल सकता है कि क्या किया जा रहा है, क्योंकि यह आमतौर पर इस्तेमाल किया जाने वाला मुहावरा नहीं है। मुझे पता है कि इसमें मुझे भ्रमित करने की क्षमता होगी।
Additonally, यदि आप KEY
निम्न के मान को बदलते हैं (लेकिन बदलने से चूक जाते हैं d.spam
), तो अब आपको मिलेंगे:
>>> KEY = 'foo'
>>> d[KEY] = 1
>>> # Several lines of miscellaneous code here...
... assert d.spam == 1
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
AttributeError: 'C' object has no attribute 'spam'
IMO, प्रयास के लायक नहीं है।
अन्य सामान
जैसा कि अन्य लोगों ने उल्लेख किया है, आप किसी भी हैशेबल ऑब्जेक्ट (न केवल एक स्ट्रिंग) का उपयोग एक तानाशाही कुंजी के रूप में कर सकते हैं। उदाहरण के लिए,
>>> d = {(2, 3): True,}
>>> assert d[(2, 3)] is True
>>>
कानूनी है, लेकिन
>>> C = type('C', (object,), {(2, 3): True})
>>> d = C()
>>> assert d.(2, 3) is True
File "<stdin>", line 1
d.(2, 3)
^
SyntaxError: invalid syntax
>>> getattr(d, (2, 3))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: getattr(): attribute name must be string
>>>
नहीं है। यह आपको अपने शब्दकोश कुंजियों के लिए प्रिंट करने योग्य वर्णों या अन्य धोने योग्य वस्तुओं की पूरी श्रृंखला तक पहुंच प्रदान करता है, जो आपके पास ऑब्जेक्ट विशेषता को एक्सेस करते समय नहीं होता है। यह कैश्ड ऑब्जेक्ट मेटाक्लास के रूप में इस तरह के जादू को संभव बनाता है, जैसे कि पायथन कुकबुक (च। 9) से नुस्खा ।
जिसमें मैं संपादकीय लिखता हूं
मैं spam.eggs
ओवर के सौंदर्यशास्त्र को पसंद करता spam['eggs']
हूं (मुझे लगता है कि यह साफ दिखता है), और मैं वास्तव में इस कार्यक्षमता को तरसना शुरू कर दिया जब मैं मिला namedtuple
। लेकिन निम्न करने में सक्षम होने की सुविधा इसे ट्रम्प करती है।
>>> KEYS = 'spam eggs ham'
>>> VALS = [1, 2, 3]
>>> d = {k: v for k, v in zip(KEYS.split(' '), VALS)}
>>> assert d == {'spam': 1, 'eggs': 2, 'ham': 3}
>>>
यह एक सरल उदाहरण है, लेकिन मैं अक्सर अपने आप को अलग-अलग स्थितियों में dicts का उपयोग करने की तुलना में पाता हूं obj.key
, जबकि मैं नोटेशन का उपयोग करता हूं (यानी, जब मुझे एक्सएमएल फ़ाइल से प्रीफ़्स पढ़ने की आवश्यकता होती है)। अन्य मामलों में, जहां मैं एक गतिशील वर्ग को तुरंत आकर्षित करने के लिए लुभाता हूं और सौंदर्य संबंधी कारणों से कुछ विशेषताओं को थप्पड़ मारता हूं, मैं पठनीयता बढ़ाने के लिए निरंतरता के लिए एक तानाशाही का उपयोग करना जारी रखता हूं।
मुझे यकीन है कि ओपी ने लंबे समय से अपनी संतुष्टि के लिए इसे हल किया है, लेकिन अगर वह अभी भी इस कार्यक्षमता को चाहता है, तो मेरा सुझाव है कि वह पीपीआई से एक पैकेज डाउनलोड करता है जो इसे प्रदान करता है:
गुच्छा वह है जिससे मैं अधिक परिचित हूं। उपवर्गdict
, तो आपके पास वह सब कार्यक्षमता है।
AttrDict भी लग रहा है यह भी बहुत अच्छा है, लेकिन मैं इसे से परिचित के रूप में नहीं कर रहा हूँ और अधिक से अधिक विवरण के रूप में में स्रोत के माध्यम से देखा नहीं किया है के रूप में मेरे पास है जैसे गुच्छा ।
- व्यसनी सक्रिय रूप से बनाए रखा है और attr की तरह पहुँच प्रदान करता है और अधिक।
- के रूप में Rotareti द्वारा टिप्पणी में बताया गया है, गुच्छा पदावनत किया गया है, लेकिन वहाँ एक सक्रिय बुलाया कांटा है मंच ।
हालांकि, उनके कोड की पठनीयता में सुधार करने के लिए मैं दृढ़ता से सलाह देता हूं कि वह अपनी संकेतन शैलियों को न मिलाएं। यदि वह इस संकेतन को पसंद करता है, तो उसे बस एक गतिशील वस्तु को तुरंत भेजना चाहिए, उसमें अपनी वांछित विशेषताएं जोड़ना चाहिए, और इसे एक दिन कहना चाहिए:
>>> C = type('C', (object,), {})
>>> d = C()
>>> d.spam = 1
>>> d.eggs = 2
>>> d.ham = 3
>>> assert d.__dict__ == {'spam': 1, 'eggs': 2, 'ham': 3}
जिसमें मैं अद्यतन करता हूं, टिप्पणियों में एक अनुवर्ती प्रश्न का उत्तर देने के लिए
टिप्पणियों में (नीचे), एल्मो पूछता है:
क्या होगा यदि आप एक गहराई तक जाना चाहते हैं? (टाइप करने का जिक्र ... ())
हालांकि मैंने इस उपयोग के मामले का उपयोग कभी नहीं किया (फिर, मैं नेस्टेड का उपयोग सुसंगतता के लिए करता हूं dict
), निम्न कोड काम करता है:
>>> C = type('C', (object,), {})
>>> d = C()
>>> for x in 'spam eggs ham'.split():
... setattr(d, x, C())
... i = 1
... for y in 'one two three'.split():
... setattr(getattr(d, x), y, i)
... i += 1
...
>>> assert d.spam.__dict__ == {'one': 1, 'two': 2, 'three': 3}
collections.namedtuple
इसके लिए बहुत उपयोगी है।