it-swarm.com.de

Ist es sinnvoll, None als Wörterbuchschlüssel in Python zu verwenden?

Keiner scheint als Wörterbuchschlüssel zu funktionieren, aber ich frage mich, ob das später nur zu Problemen führen wird. Das funktioniert zum Beispiel:

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

Die tatsächlichen Daten, mit denen ich arbeite, sind Bildungsstandards. Jeder Standard ist einem Inhaltsbereich zugeordnet. Einige Standards sind auch mit Inhaltsunterbereichen verbunden. Ich möchte ein verschachteltes Wörterbuch der Form {contentArea:{contentSubArea:[standards]}} erstellen. Einige dieser contentSubArea-Schlüssel wären None.

Insbesondere frage ich mich, ob dies zu Verwirrung führen wird, wenn ich nach einem Schlüssel suche, der irgendwann nicht mehr existiert, oder nach etwas Unerwartetem.

41
japhyr

Jeder Hashwert ist ein gültiger Python Dictionary-Schlüssel. Aus diesem Grund ist None ein vollkommen gültiger Kandidat. Bei der Suche nach nicht vorhandenen Schlüsseln gibt es keine Verwirrung. Das Vorhandensein von None als Schlüssel hat keinen Einfluss auf die Möglichkeit, zu prüfen, ob ein anderer Schlüssel vorhanden ist. Ex:

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

Es gibt keinen Konflikt und Sie können wie normal testen. Es sollte dir kein Problem bereiten. Die Standard-1-zu-1-Schlüssel-Wert-Zuordnung ist immer noch vorhanden. Sie können also nicht mehrere Elemente im None-Schlüssel verwenden. Die Verwendung von None als Schlüssel sollte jedoch kein Problem darstellen.

48
g.d.d.c

None ist in keiner Weise speziell, es ist nur ein weiterer Python-Wert. Der einzige Unterschied besteht darin, dass es sich dabei um den Rückgabewert einer Funktion handelt, der keinen anderen Rückgabewert angibt, und es ist auch ein üblicher Standardwert (z. B. der Standardargument von dict.get()).

Sie verursachen keine Laufzeitkonflikte, wenn Sie einen solchen Schlüssel verwenden. Sie sollten sich jedoch fragen, ob dies wirklich ein sinnvoller Wert ist, den Sie für einen Schlüssel verwenden können. Unter dem Blickwinkel des Lesens von Code und des Verständnisses dessen ist es oft hilfreicher, eine bestimmte Instanz für spezielle Werte zu verwenden. So etwas wie:

NoSubContent = SubContentArea(name=None)

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

Du willst Ärger? Auf geht's:

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

Ja, halten Sie sich von json fern, wenn Sie None als Schlüssel verwenden. Sie können dies mit einem benutzerdefinierten (de /) -Serialisierer korrigieren, aber ich würde von der Verwendung von None als Schlüssel abraten.

6

Es scheint mir, das größere, spätere Problem ist das. Wenn Ihr Prozess Paare erstellt und einige Paare den Schlüssel "Keine" haben, werden alle vorherigen Keine-Paare überschrieben. Ihr Wörterbuch wirft Werte unbemerkt aus, weil Sie keine Schlüssel vorhanden haben. Nein?

2
user3023464

Komisch, auch das funktioniert: 

d = {None: 'None'}

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