Je consomme plusieurs points de terminaison d'une API qui est très verbeuse dans les données qu'elle renvoie. Je voudrais fournir un sous-ensemble de ces données à un autre morceau de code ailleurs.Comment masquer un dictionnaire imbriqué Python 3 pour renvoyer un nouveau dictionnaire avec seulement certains éléments?
Supposons que je me donne plusieurs dictionnaires comme celui-ci (que je prévois faire une boucle à travers et filtre):
asset = {
'id': 1,
'name': 'MY-PC',
'owner': 'me',
'location': 'New York City',
'model': {
'id': 1,
'name': 'Surface',
'manufacturer': {
'id': 1,
'name': 'Microsoft'
}
}
}
Je veux créer une fonction qui prendra ce dictionnaire, avec un « masque » qui sera utilisé pour créer un nouveau dictionnaire des seuls éléments autorisés. Cela pourrait être un masque par exemple (bien que, je peux travailler avec ce format permet le code résultant le plus concis):
mask = {
'id': True,
'name': True,
'model': {
'id': True,
'name': True,
'manufacturer': {
'name': True
}
}
}
La fonction doit alors retourner ceci:
mask = {
'id': 1,
'name': 'MY-PC',
'model': {
'id': 1,
'name': 'Surface',
'manufacturer': {
'name': 'Microsoft'
}
}
}
Y at-il quelque chose déjà construit en Python 3 qui aiderait à cela? Il semble que si je dois le faire manuellement, ça va devenir assez moche rapidement. J'ai trouvé itertools.compress
, mais cela semble être pour des listes et ne gérera pas la complexité des dictionnaires.
Avez-vous entendu parler de ['jq (1)'] (https://stedolan.github.io/jq/)? – o11c
Qu'est-ce qui devrait arriver lorsque les clés du masque n'ont pas de clé de données correspondante? –