def is_superset(obj1, obj2, path=""):
	"""
	Checks whether obj1 is a superset of obj2.

	Parameter *obj1*:
		Superset object
	
	Parameter *obj2*:
		Subset object
		
	Parameter *path*:
		Should be "" in initial call
	
	Return value:
	  Returns a tuple with 2 arguments. The first argument is a boolean which is true, if obj1 is superset of obj2, false otherwise.
	  The second argument returns a string if the first argument is false. The string contains the reason why obj1 is not a superset of obj2. 
	
	"""
	if obj2 is None:
		return (True, None)
	if isinstance(obj1, dict):
		if not isinstance(obj2, dict):
			return (False, "Type mismatch: %s, is dict instead of %s" % (path, type(obj2)))
		for key in obj2:
			if not key in obj1:
				return (False, "Key %s missing: %s" % (key, path))
			(res, msg) = is_superset(obj1[key], obj2[key], path+"."+key)
			if not res:
				return (False, msg)
	elif isinstance(obj1, list):
		if not isinstance(obj2, list):
			return (False, "Type mismatch: %s, is list instead of %s" % (path, type(obj2)))
		for el in obj2:
			if not el in obj1:
				return (False, "Element %s missing: %s" % (el, path))
	else:
		return (obj1 == obj2, "Value mismatch: %s, is %s instead of %s" % (path, repr(obj1), repr(obj2)))
	return (True, None)