Anda bisa menggunakan get
dua kali:
example_dict.get('key1', {}).get('key2')
Ini akan kembali None
jika salah satu key1
atau key2
tidak ada.
Perhatikan bahwa ini masih bisa menaikkan AttributeError
jika example_dict['key1']
ada tetapi bukan dict (atau objek seperti dict dengan get
metode). The try..except
kode yang diposting akan menaikkan TypeError
bukan jika example_dict['key1']
adalah unsubscriptable.
Perbedaan lainnya adalah bahwa try...except
hubungan arus pendek segera setelah kunci pertama hilang. Rantai get
panggilan 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 Hasher
merupakan subkelas dari dict
Anda 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 dict
menjadi Hasher
seperti ini:
hasher = Hasher(example_dict)
dan mengonversi a Hasher
menjadi reguler dict
dengan 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')