2016-08-06 1 views
2

J'ai actuellement un objet passé à mon callback qui est un dictionnaire et que je dois retourner.Dictionnaire: Rétablir/supprimer setdefault

L'invocateur a appelé obj.setdefault("Server", "Something") sur le dictionnaire pour qu'il ait une valeur par défaut même si la paire clé/valeur n'existe pas.

Comment puis-je annuler/supprimer setdefault (supprimer la valeur par défaut)? Je veux dire que je ne veux tout simplement pas cette paire clé/valeur dans la dict et il semble qu'elle n'a pas de complications si la clé ne se ferme pas, mais elle est toujours ajoutée à cause de la valeur par défaut.

+3

Tout supprimer l'entrée comme une autre? 'del obj ['Serveur']'? – user2357112

+0

Voulez-vous l'enlever uniquement s'il s'agit de la valeur par défaut? – zondo

+2

Peut-être un problème XY. Si vous ne voulez pas que la valeur par défaut apparaisse dans la dict, n'utilisez pas 'setdefault (clé, défaut)' mais 'get (clé, défaut)'. –

Répondre

5

La méthode setdefault définit la valeur de la clé Server sur Something (tant que la clé Server n'est pas déjà dans le dictionnaire). Vous pouvez simplement supprimer le Server clé du dictionnaire:

if 'Server' in obj: del obj['Server'] 

Si vous ne souhaitez pas supprimer la clé du serveur lorsque sa valeur est différente de Something, faites:

if obj['Server'] == 'Something': del obj['Server'] 

Cependant, vous ne pouvez pas Indique si la valeur Server a été ajoutée au dictionnaire en tant que valeur par défaut ou en tant que paramètre brut d'une paire valeur/clé. En effet, après avoir appelé setdefault, le dictionnaire contient la paire clé-valeur sans indication de la manière dont elle a été ajoutée.

Démonstration:

>>>d = {} 
>>>d.setdefault("Server", "Something") 
>>>d 
{'Server': 'Something'} 
>>>del d['Server'] 
>>>d 
{} 
0

En supposant que la valeur ne figure pas dans le dictionnaire lors du passage au rappel, dict.setdefault n'est pas vraiment le problème - cette opération est l'une des nombreuses disponibles pour changer un dictionnaire python. Plus précisément, il garantit que SOMETHING est stocké pour la clé donnée, ce qui peut être fait directement de toute façon avec une affectation indexée. Tant que votre code et l'invocateur maintiennent une référence au même dictionnaire, vous n'avez pas d'autre choix que de faire confiance à l'invocateur (et à tous les autres détenteurs de référence dans ce dictionnaire).

La mutabilité du dictionnaire est le problème, de sorte que les solutions possibles s'orientent autour de la marge de manœuvre dans la conception. Je ne peux penser à:

  • copie le dictionnaire quand il est passé dans le rappel, et/ou
  • modifier la valeur de retour à une copie ou d'un (en lecture seule) vue du dictionnaire
+0

Merci pour le pointeur. À un moment donné, je l'ai fait, mais j'ai décidé de rester simple et direct. Édité. –