Существует ли хороший подход к тесту, если словарь содержит несколько ключей?
Короткая версия:
d = {}
if 'a' in d and 'b' in d and 'c' in d:
pass #do something
Спасибо.
Править: Я могу только использовать python2.4-.-
Вы можете использовать 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
if all(test in d for test in ('a','b','c')):
# do something
В версии 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, не имеют концепции порядка) .
Можно использовать средство получения элементов, заключенное в команду 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'
Но на самом деле я предпочитаю решение Пола Макгуайра
В Python3 вы можете написать
set("abc")<=d.keys()
В Python2.7 вы, конечно, можете написать
d.viewkeys()>=set("abc")
, если ключи не являются одиночными символами, вы можете заменить
set ("abc")
с set (('a', 'b', 'c'))