Here is a general recursive solution to a given task:
import traceback import unittest def is_subset(superset, subset): for key, value in subset.items(): if key not in superset: return False if isinstance(value, dict): if not is_subset(superset[key], value): return False elif isinstance(value, str): if value not in superset[key]: return False elif isinstance(value, list): if not set(value) <= set(superset[key]): return False elif isinstance(value, set): if not value <= superset[key]: return False else: if not value == superset[key]: return False return True class Foo(unittest.TestCase): def setUp(self): self.dct = { 'a': 'hello world', 'b': 12345, 'c': 1.2345, 'd': [1, 2, 3, 4, 5], 'e': {1, 2, 3, 4, 5}, 'f': { 'a': 'hello world', 'b': 12345, 'c': 1.2345, 'd': [1, 2, 3, 4, 5], 'e': {1, 2, 3, 4, 5}, 'g': False, 'h': None }, 'g': False, 'h': None, 'question': 'mcve', 'metadata': {} } def tearDown(self): pass def check_true(self, superset, subset): return self.assertEqual(is_subset(superset, subset), True) def check_false(self, superset, subset): return self.assertEqual(is_subset(superset, subset), False) def test_simple_cases(self): self.check_true(self.dct, {'a': 'hello world'}) self.check_true(self.dct, {'b': 12345}) self.check_true(self.dct, {'c': 1.2345}) self.check_true(self.dct, {'d': [1, 2, 3, 4, 5]}) self.check_true(self.dct, {'e': {1, 2, 3, 4, 5}}) self.check_true(self.dct, {'f': { 'a': 'hello world', 'b': 12345, 'c': 1.2345, 'd': [1, 2, 3, 4, 5], 'e': {1, 2, 3, 4, 5}, }}) self.check_true(self.dct, {'g': False}) self.check_true(self.dct, {'h': None}) def test_tricky_cases(self): self.check_true(self.dct, {'a': 'hello'}) self.check_true(self.dct, {'d': [1, 2, 3]}) self.check_true(self.dct, {'e': {3, 4}}) self.check_true(self.dct, {'f': { 'a': 'hello world', 'h': None }}) self.check_false( self.dct, {'question': 'mcve', 'metadata': {'author': 'BPL'}}) self.check_true( self.dct, {'question': 'mcve', 'metadata': {}}) self.check_false( self.dct, {'question1': 'mcve', 'metadata': {}}) if __name__ == "__main__": unittest.main()
NOTE. The source code will not work in certain cases, credits for correction will be sent to @ olivier-melançon