Подтвердить что ты не робот

Python: разумно ли использовать None в качестве словарного ключа?

Нет, похоже, работает как словарь, но мне интересно, не приведет ли это к неприятности позже. Например, это работает:

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

Фактические данные, с которыми я работаю, - это образовательные стандарты. Каждый стандарт связан с областью содержимого. Некоторые стандарты также связаны с подрайонами контента. Я хотел бы сделать вложенный словарь формы {contentArea:{contentSubArea:[standards]}}. Некоторые из этих ключей contentSubArea будут None.

В частности, мне интересно, не приведет ли это к путанице, если я найду ключ, который не существует в какой-то момент или что-то непредвиденное.

4b9b3361

Ответ 1

Любое хешируемое значение является допустимым ключом словаря Python. По этой причине ни один из них не является вполне допустимым кандидатом. Там нет путаницы при поиске несуществующих ключей - присутствие None в качестве ключа не повлияет на возможность проверки наличия другого ключа. Пример:

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

Нет конфликта, и вы можете проверить его, как обычно. Это не должно вызывать проблем. Стандартная ассоциация Key-Value 1-to-1 все еще существует, поэтому вы не можете иметь несколько элементов в ключе None, но использование None в качестве ключа не должно представлять проблему самостоятельно.

Ответ 2

None не является особенным каким-либо конкретным способом, это просто другое значение python. Единственное его отличие состоит в том, что это возвращаемое значение функции, которая не указывает никакого другого возвращаемого значения, а также является обычным значением по умолчанию (например, аргумент по умолчанию dict.get()).

Вы не будете приводить к конфликтам во время выполнения с помощью такого ключа, но вы должны спросить себя, действительно ли это значимое значение для использования ключа. Часто полезно с точки зрения чтения кода и понимания того, что он делает, использовать назначенный экземпляр для специальных значений. Что-то вроде:

NoSubContent = SubContentArea(name=None)

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

Ответ 3

Вам нужны неприятности? здесь мы идем:

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

Так что, лучше держаться подальше от json, если вы используете None в качестве ключа. Вы можете исправить это с помощью пользовательского (de/) сериализатора, но я бы посоветовал не использовать None в качестве ключа в первую очередь.

Ответ 4

Мне кажется, чем больше, тем позже проблема. Если ваш процесс создает пары, а некоторые пары имеют ключ "Нет", он перезаписывает все предыдущие пары "Нет". Ваш словарь будет молча выкидывать значения, потому что у вас есть дубликаты None. Нет?

Ответ 5

Смешно, хотя даже это работает:

d = {None: 'None'}

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

Ответ 6

Нет. Это только вызовет головные боли в будущем. Используйте фиктивный нуль вместо фактического нулевого значения, если у вас нет клавиши contentSubArea.