Как протестировать, если словарь содержит определенные ключи

Существует ли хороший подход к тесту, если словарь содержит несколько ключей?

Короткая версия:

d = {}
if 'a' in d and 'b' in d and 'c' in d:
    pass #do something

Спасибо.

Править: Я могу только использовать python2.4-.-

7
задан ЯegDwight 5 August 2010 в 14:26
поделиться

5 ответов

Вы можете использовать set.issubset (.. .) , например:

>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> set(['a', 'b']).issubset(d)
True
>>> set(['a', 'x']).issubset(d)
False

Python 3 представил синтаксис набора литералов, который был перенесен в Python 2.7, поэтому в наши дни приведенное выше можно записать:

>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> {'a', 'b'}.issubset(d)
True
>>> {'a', 'x'}.issubset(d)
False
21
ответ дан 6 December 2019 в 04:51
поделиться
if all(test in d for test in ('a','b','c')):
    # do something
20
ответ дан 6 December 2019 в 04:51
поделиться

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

missing = set(d).difference(('a', 'b', 'c'))
if missing:
    logging.warn("Missing keys: %s", ', '.join(sorted(missing)))
else:
    ...

заменяя вызов logging.warn соответствующим образом, конечно (возможно, просто logging.info или даже logging.debug, возможно logging.error, может быть исключение).

Часть sorted в основном носит косметический характер (мне нравятся надежные, повторяющиеся сообщения об ошибках), но также немного помогает при тестировании (когда я создаю макет logging.warn - или что-то еще - в тестах, это приятно иметь возможность ожидать конкретную строку, и если я не отсортирую отсутствующий набор , строка предупреждения, конечно, может отличаться, поскольку наборы, такие как dicts, не имеют концепции порядка) .

1
ответ дан 6 December 2019 в 04:51
поделиться

Можно использовать средство получения элементов, заключенное в команду try / except.

>>> from operator import itemgetter
>>> d = dict(a=1,b=2,c=3,d=4)
>>> e = dict(a=1,b=2,c=3,e=4)
>>> getter=itemgetter('a','b','c','d')
>>> getter(d)
(1, 2, 3, 4)
>>> getter(e)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'd'

Но на самом деле я предпочитаю решение Пола Макгуайра

1
ответ дан 6 December 2019 в 04:51
поделиться

В Python3 вы можете написать

set("abc")<=d.keys()

В Python2.7 вы, конечно, можете написать

d.viewkeys()>=set("abc")

, если ключи не являются одиночными символами, вы можете заменить set ("abc") с set (('a', 'b', 'c'))

5
ответ дан 6 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: