Bu sorunun oldukça eski olduğunu biliyorum, ama yine de iç içe bir sözlüğü güncellemem gerektiğinde yaptığım şeyi gönderiyorlar. Anahtarların yolunun bilindiği ve noktadan ayrıldığı varsayılarak, dikmelerin python'da referansla geçirildiği gerçeğini kullanabiliriz. Forex, data adında bir sözümüz varsa:
{
"log_config_worker": {
"version": 1,
"root": {
"handlers": [
"queue"
],
"level": "DEBUG"
},
"disable_existing_loggers": true,
"handlers": {
"queue": {
"queue": null,
"class": "myclass1.QueueHandler"
}
}
},
"number_of_archived_logs": 15,
"log_max_size": "300M",
"cron_job_dir": "/etc/cron.hourly/",
"logs_dir": "/var/log/patternex/",
"log_rotate_dir": "/etc/logrotate.d/"
}
Ve kuyruk sınıfını güncellemek istiyoruz, anahtarın yolu - log_config_worker.handlers.queue.class
Değeri güncellemek için aşağıdaki işlevi kullanabiliriz:
def get_updated_dict(obj, path, value):
key_list = path.split(".")
for k in key_list[:-1]:
obj = obj[k]
obj[key_list[-1]] = value
get_updated_dict(data, "log_config_worker.handlers.queue.class", "myclass2.QueueHandler")
Bu, sözlüğü doğru şekilde güncelleyecektir.