Je sais que cette question est assez ancienne, mais je continue à afficher ce que je fais lorsque je dois mettre à jour un dictionnaire imbriqué. Nous pouvons utiliser le fait que les dictionnaires sont passés par référence en Python. En supposant que le chemin de la clé est connu et est séparé par des points. Forex si nous avons un dict nommé data :
{
"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/"
}
Et nous voulons mettre à jour la classe de la file d'attente, le chemin de la clé serait - log_config_worker.handlers.queue.class
Nous pouvons utiliser la fonction suivante pour mettre à jour la valeur :
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")
Cela permettrait de mettre à jour le dictionnaire correctement.
0 votes
L'imbrication est-elle toujours de trois niveaux de profondeur ou peut-on avoir une imbrication d'une profondeur arbitraire ?
1 votes
Il peut avoir n'importe quelle profondeur/longueur.
0 votes
Corrigez-moi si je me trompe, mais il semble que la solution idéale ici nécessite la mise en œuvre du modèle de conception composite.