Как утверждать, что dict содержит другой dict без assertDictContainsSubset в python?

Я знаю, что assertDictContainsSubset может сделать это в python 2.7, но по какой-то причине он устарел в python 3.2. Так есть ли способ утверждать, что dict содержит другой без assertDictContainsSubset ?

Это кажется не очень хорошим:

 for item in dic2: self.assertIn(item, dic) 

любой другой хороший способ? благодаря

4 Solutions collect form web for “Как утверждать, что dict содержит другой dict без assertDictContainsSubset в python?”

 >>> d1 = dict(a=1, b=2, c=3, d=4) >>> d2 = dict(a=1, b=2) >>> set(d2.items()).issubset( set(d1.items()) ) True 

И наоборот:

 >>> set(d1.items()).issubset( set(d2.items()) ) False 

Ограничение: значения словаря должны быть хешируемыми.

Вот сравнение, которое работает, даже если у вас есть списки в словарях:

 superset = {'a': 1, 'b': 2} subset = {'a': 1} common = { key: superset[key] for key in set(superset.keys()).intersection(set(subset.keys())) } self.assertEquals(common, subset) 

Решение John1024 работало для меня. Однако в случае сбоя он сообщает только False а не показывает, какие ключи не совпадают. Поэтому я попытался избежать метода устаревших утверждений, используя другие методы утверждения, которые будут выводить полезные сообщения об ошибках:

  expected = {} for key in input_dict.keys(): self.assertIn(key, set(response.data.keys())) expected[key] = response.data[key] self.assertDictEqual(input_dict, expected) 

Это отвечает на более широкий вопрос, чем вы просите, но я использую это в своих тестовых жгутах, чтобы узнать, container словарь container что-то похожее на словарь. Это проверяет ключи и значения. Кроме того, вы можете использовать ключевое слово 'ANYTHING' чтобы указать, что вам все равно, как он соответствует.

 def contains(container, contained): '''ensure that `contained` is present somewhere in `container` EXAMPLES: contains( {'a': 3, 'b': 4}, {'a': 3} ) # True contains( {'a': [3, 4, 5]}, {'a': 3}, ) # True contains( {'a': 4, 'b': {'a':3}}, {'a': 3} ) # True contains( {'a': 4, 'b': {'a':3, 'c': 5}}, {'a': 3, 'c': 5} ) # True # if an `contained` has a list, then every item from that list must be present # in the corresponding `container` list contains( {'a': [{'b':1}, {'b':2}, {'b':3}], 'c':4}, {'a': [{'b':1},{'b':2}], 'c':4}, ) # True # You can also use the string literal 'ANYTHING' to match anything contains( {'a': [{'b':3}]}, {'a': 'ANYTHING'}, ) # True # You can use 'ANYTHING' as a dict key and it indicates to match the corresponding value anywhere # below the current point contains( {'a': [ {'x':1,'b1':{'b2':{'c':'SOMETHING'}}}]}, {'a': {'ANYTHING': 'SOMETHING', 'x':1}}, ) # True contains( {'a': [ {'x':1, 'b':'SOMETHING'}]}, {'a': {'ANYTHING': 'SOMETHING', 'x':1}}, ) # True contains( {'a': [ {'x':1,'b1':{'b2':{'c':'SOMETHING'}}}]}, {'a': {'ANYTHING': 'SOMETHING', 'x':1}}, ) # True ''' ANYTHING = 'ANYTHING' if contained == ANYTHING: return True if container == contained: return True if isinstance(container, list): if not isinstance(contained, list): contained = [contained] true_count = 0 for contained_item in contained: for item in container: if contains(item, contained_item): true_count += 1 break if true_count == len(contained): return True if isinstance(contained, dict) and isinstance(container, dict): contained_keys = set(contained.keys()) if ANYTHING in contained_keys: contained_keys.remove(ANYTHING) if not contains(container, contained[ANYTHING]): return False container_keys = set(container.keys()) if len(contained_keys - container_keys) == 0: # then all the contained keys are in this container ~ recursive check if all( contains(container[key], contained[key]) for key in contained_keys ): return True # well, we're here, so I guess we didn't find a match yet if isinstance(container, dict): for value in container.values(): if contains(value, contained): return True return False 
  • unittest - запустить те же тесты для списка входов и выходов
  • Как утверждать операторы <и> = не реализованы?
  • Переопределение модуля тестирования модуля Python для пользовательского вывода?
  • Есть ли способ начать модульные тесты, связанные только с измененным кодом?
  • python unittest assertRaises
  • Заказ тестов в python unittest
  • AttributeError: объект 'module' не имеет атрибутов 'tests'
  • Как написать unittests для дополнительной зависимости в пакете python?
  • Рекурсивный unittest обнаружить
  • Python unittest игнорирует numpy
  • Невозможно запустить главную функцию unittest в ноутбуке ipython / jupyter
  • Python - лучший язык программирования в мире.