आप 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')