web-dev-qa-db-ja.com

Pythonで辞書キーとしてNoneを使用するのは理にかなっていますか?

辞書キーとして機能するものはないようですが、後で問題が発生するのではないかと思います。たとえば、これは動作します:

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

私が扱っている実際のデータは、教育基準です。すべての規格はコンテンツ領域に関連付けられています。一部の標準は、コンテンツサブエリアにも関連付けられています。 {contentArea:{contentSubArea:[standards]}}という形式のネストされた辞書を作成したいと思います。これらのcontentSubAreaキーの一部はNoneになります。

特に、ある時点で存在しないキー、またはそのような予期しないものを探すと、混乱を招くのではないかと思います。

58
japhyr

ハッシュ可能な値はすべて有効ですPython辞書キー。このため、Noneは完全に有効な候補です。存在しないキーを探すときに混乱はありません-キーとしてNoneが存在しても、別のキーが存在するかどうかを確認する機能に影響します。例:

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

競合はなく、通常と同じようにテストできます。問題が発生することはありません。標準の1対1のKey-Value関連付けはまだ存在するため、Noneキーに複数のものを含めることはできませんが、Noneをキーとして使用しても問題は発生しません。

54
g.d.d.c

Noneは特別な方法ではなく、単なる別のpython値です。唯一の違いは、何も指定していない関数の戻り値であることです。他の戻り値、そしてそれはたまたま一般的なデフォルト値(たとえば、dict.get()のデフォルト引数)にもなります。

そのようなキーを使用して実行時の競合を引き起こすことはありませんが、それが実際にキーに使用する意味のある値であるかどうかを確認する必要があります。コードを読んでそれが何をするのかを理解する観点からは、特別な値に指定されたインスタンスを使用する方が便利な場合がよくあります。何かのようなもの:

NoSubContent = SubContentArea(name=None)

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

困った?さあ行こう:

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

ですから、Noneをキーとして使用する場合は、jsonから離れたほうがよいでしょう。これにはカスタム(de /)シリアライザーを使用してパッチを適用できますが、そもそもNoneをキーとして使用しないことをお勧めします。

6

私には、大きく、後で問題が発生するようです。プロセスがペアを作成していて、一部のペアが「なし」キーを持っている場合、それは以前のすべてのなしペアを上書きします。重複するNoneキーがあったため、辞書は黙って値をスローします。番号?

2
user3023464

おかしいですが、これでもうまくいきます:

d = {None: 'None'}

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

jsonifyは、Noneキーを持つ辞書をサポートしていません。

From Flask import jsonify

def json_():
    d = {None: 'None'}
    return jsonify(d)

これはエラーをスローします:
TypeError: '<'は、 'NoneType'と 'str'のインスタンス間ではサポートされていません

0
adam shamsudeen