Anda bisa menggunakan getdua kali:
example_dict.get('key1', {}).get('key2')
Ini akan kembali Nonejika salah satu key1atau key2tidak ada.
Perhatikan bahwa ini masih bisa menaikkan AttributeErrorjika example_dict['key1']ada tetapi bukan dict (atau objek seperti dict dengan getmetode). The try..exceptkode yang diposting akan menaikkan TypeErrorbukan jika example_dict['key1']adalah unsubscriptable.
Perbedaan lainnya adalah bahwa try...excepthubungan arus pendek segera setelah kunci pertama hilang. Rantai getpanggilan tidak.
Jika Anda ingin mempertahankan sintaks, example_dict['key1']['key2']tetapi tidak ingin itu meningkatkan KeyErrors, maka Anda bisa menggunakan resep Hasher :
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'>
Perhatikan bahwa ini mengembalikan Hasher kosong ketika kunci hilang.
Karena Hashermerupakan subkelas dari dictAnda dapat menggunakan Hasher dengan cara yang sama seperti Anda dapat menggunakan a dict. Semua metode dan sintaksis yang sama tersedia, Hashers hanya memperlakukan kunci yang hilang secara berbeda.
Anda dapat mengubah biasa dictmenjadi Hasherseperti ini:
hasher = Hasher(example_dict)
dan mengonversi a Hashermenjadi reguler dictdengan mudah:
regular_dict = dict(hasher)
Alternatif lain adalah menyembunyikan keburukan dalam fungsi pembantu:
def safeget(dct, *keys):
for key in keys:
try:
dct = dct[key]
except KeyError:
return None
return dct
Sehingga sisa kode Anda dapat tetap terbaca:
safeget(example_dict, 'key1', 'key2')