आप getदो बार उपयोग कर सकते हैं :
example_dict.get('key1', {}).get('key2')
यह या Noneतो वापस आ जाएगा key1या key2मौजूद नहीं है।
ध्यान दें कि यह अभी भी एक बढ़ा सकता है AttributeError, तो example_dict['key1']मौजूद है, लेकिन एक dict (या एक dict जैसी वस्तु एक साथ नहीं है getविधि)। यदि try..exceptआपने पोस्ट किया है तो कोड TypeErrorइसके बजाय उठाएगा यदि example_dict['key1']सदस्यता समाप्त नहीं होगी।
एक और अंतर यह है कि try...exceptपहली लापता कुंजी के तुरंत बाद शॉर्ट-सर्किट। getकॉल की श्रृंखला नहीं है।
यदि आप वाक्य रचना को संरक्षित example_dict['key1']['key2']करना चाहते हैं , लेकिन यह कभी नहीं चाहते कि KeyErrors बढ़ाएं, तो आप हैश नुस्खा का उपयोग कर सकते हैं :
class Hasher(dict):
# https://stackoverflow.com/a/3405143/190597
def __missing__(self, key):
value = self[key] = type(self)()
return value
example_dict = Hasher()
print(example_dict['key1'])
# {}
print(example_dict['key1']['key2'])
# {}
print(type(example_dict['key1']['key2']))
# <class '__main__.Hasher'>
ध्यान दें कि जब कोई कुंजी गुम होती है तो यह खाली हाशर देता है।
चूँकि Hasherआप एक उपवर्ग का dictउपयोग कर सकते हैं, उसी तरह से आप एक हैशर का उपयोग कर सकते हैं dict। सभी समान तरीके और वाक्यविन्यास उपलब्ध हैं, हैशर्स केवल लापता कुंजी का अलग तरीके से इलाज करते हैं।
आप एक नियमित परिवर्तित कर सकते हैं dictएक में Hasherइस तरह:
hasher = Hasher(example_dict)
और एक Hasherको एक नियमित dictरूप से आसानी से रूपांतरित करें :
regular_dict = dict(hasher)
एक अन्य विकल्प कुरूपता को एक सहायक कार्य में छिपाना है:
def safeget(dct, *keys):
for key in keys:
try:
dct = dct[key]
except KeyError:
return None
return dct
तो आपके बाकी कोड अपेक्षाकृत पठनीय रह सकते हैं:
safeget(example_dict, 'key1', 'key2')