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

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

Короткий вариант:

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 

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

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

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

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

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

Может использовать элемент itemgetter, завернутый в 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' 

Но на самом деле я предпочитаю решение Paul McGuire

В 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 – или что-то еще – в тестах, приятно иметь возможность ожидать определенной строки , и если бы я не отсортировал missing набор, строка предупреждения может меняться, конечно, так как наборы, такие как dicts, не имеют понятия порядка).