ऐसा करने का सबसे आसान तरीका शायद tag:yaml.org,2002:map
के लिए वाईएएमएल कन्स्ट्रक्टर को ओवरराइट करना है, इसलिए यह सामान्य शब्दकोश के बजाय एक कस्टम शब्दकोश कक्षा देता है।
import yaml
class AttrDict(object):
def __init__(self, attr):
self._attr = attr
def __getattr__(self, attr):
try:
return self._attr[attr]
except KeyError:
raise AttributeError
def construct_map(self, node):
# WARNING: This is copy/pasted without understanding!
d = {}
yield AttrDict(d)
d.update(self.construct_mapping(node))
# WARNING: We are monkey patching PyYAML, and this will affect other clients!
yaml.add_constructor('tag:yaml.org,2002:map', construct_map)
YAML = """
config:
- id: foo
- name: bar
content:
- run: xxx
- remove: yyy
"""
obj = yaml.load(YAML)
print(obj.config[0].id) # prints foo
ध्यान दें कि यह प्रक्रिया YAML का उपयोग करता है, अगर यह सब कुछ सामान्य अजगर तरीके से काम करने की उम्मीद में सब कुछ टूट जाएगा। आप एक कस्टम लोडर का उपयोग कर सकते हैं, लेकिन मुझे व्यक्तिगत रूप से PyYAML दस्तावेज़ थोड़ा भूलभुलैया मिलती है, और ऐसा लगता है कि दुष्प्रभाव एक अपवाद के बजाय एक नियम के रूप में वैश्विक और संक्रामक हैं।
आपको चेतावनी दी गई है।
एक विकल्प के रूप में, अगर अपने स्कीमा अपेक्षाकृत स्थिर आप अपने खुद के वर्गों लिख सकते हैं और उन लोगों के लिए deserialize सकता है (जैसे, class Config
साथ id
और name
गुण)। हालांकि, यह शायद अतिरिक्त कोड की लागत के लायक नहीं होगा।
स्रोत
2012-06-15 11:19:12
http://stackoverflow.com/questions/2352181/how-to-use-a-dot-to-access-members-of-dictionary – Justin
@ जस्टिन का डुप्लिकेट: यह इस प्रश्न का डुप्लिकेट नहीं है, क्योंकि आप 'dict' के उदाहरणों की बजाय इच्छित वर्ग की वस्तुओं को बनाने के लिए YAML लोडर को आसानी से पैच कर सकते हैं। –