web-dev-qa-db-fra.com

Est-il raisonnable d’utiliser None comme clé de dictionnaire en Python?

Aucune ne semble fonctionner comme une clé de dictionnaire, mais je me demande si cela ne fera que créer des problèmes plus tard. Par exemple, cela fonctionne:

>>> x={'a':1, 'b':2, None:3}
>>> x
{'a': 1, None: 3, 'b': 2}
>>> x[None]
3

Les données réelles avec lesquelles je travaille sont les normes éducatives. Chaque norme est associée à une zone de contenu. Certaines normes sont également associées à des sous-domaines de contenu. Je voudrais faire un dictionnaire imbriqué de la forme {contentArea:{contentSubArea:[standards]}}. Certaines de ces clés contentSubArea seraient None.

En particulier, je me demande si cela risque de semer la confusion si je recherche une clé qui n'existe pas à un moment donné ou quelque chose d'inattendu de ce type.

41
japhyr

Toute valeur hashable est une clé de dictionnaire Python valide. Pour cette raison, None est un candidat parfaitement valide. Il n'y a pas de confusion dans la recherche de clés inexistantes - la présence de Aucune en tant que clé n'affectera pas la possibilité de vérifier si une autre clé est présente. Ex:

>>> d = {1: 'a', 2: 'b', None: 'c'}
>>> 1 in d
True
>>> 5 in d
False
>>> None in d
True

Il n'y a pas de conflit et vous pouvez le tester comme d'habitude. Cela ne devrait pas vous causer de problèmes. L'association standard 1-à-1 clé-valeur existe toujours, vous ne pouvez donc pas avoir plusieurs éléments dans la clé Aucun, mais l'utilisation de Aucune comme clé ne devrait pas poser de problème en soi.

48
g.d.d.c

None n'est pas spécial, il s'agit simplement d'une autre valeur python. Sa seule différence est qu'il s'agit de la valeur de retour d'une fonction qui ne spécifie aucune autre valeur de retour et qu'il s'agit également d'une valeur par défaut commune (l'argument par défaut de dict.get(), par exemple).

Vous ne causerez pas de conflits d’exécution avec une telle clé, mais vous devriez vous demander si c’est vraiment une valeur significative / à utiliser pour une clé. Il est souvent plus utile, du point de vue de la lecture du code et de sa compréhension, d’utiliser une instance désignée pour des valeurs spéciales. Quelque chose comme:

NoSubContent = SubContentArea(name=None)

{"contentArea": 
    {NoSubContent:[standards], 
     SubContentArea(name="Fruits"): ['apples', 'bananas']}}

Tu veux des ennuis? Et c'est parti:

>>> json.loads(json.dumps({None:None}))
{u'null': None}

Alors, mieux vaut rester loin de JSON si vous utilisez None comme clé. Vous pouvez corriger cela par un sérialiseur (de /) personnalisé, mais je vous déconseille d'utiliser None comme clé.

6
Maciej Urbański

Il me semble que le problème le plus important et le plus tardif est le suivant. Si votre processus crée des paires et que certaines paires ont une clé "Aucune", elles écraseront toutes les paires Aucune précédentes. Votre dictionnaire éliminera silencieusement les valeurs car vous aviez des clés Aucun en double. Non?

2
user3023464

C'est drôle, même si cela fonctionne: 

d = {None: 'None'}

In [10]: None in d
Out[10]: True
0
sb32134