code: def _compile_dict(self, schema):
          base_validate = self._compile_mapping(
              schema, invalid_msg='dictionary value')
          groups_of_exclusion = {}
          groups_of_inclusion = {}
          for node in schema:
              if isinstance(node, Exclusive):
                  g = groups_of_exclusion.setdefault(node.group_of_exclusion, [])
                  g.append(node)
              elif isinstance(node, Inclusive):
                  g = groups_of_inclusion.setdefault(node.group_of_inclusion, [])
                  g.append(node)
          def validate_dict(path, data):
              if not isinstance(data, dict):
                  raise er.DictInvalid('expected a dictionary', path)
              errors = []
              for label, group in groups_of_exclusion.items():
                  exists = False
                  for exclusive in group:
                      if exclusive.schema in data:
                          if exists:
                              msg = exclusive.msg if hasattr(exclusive, 'msg') and exclusive.msg else \
                                  "two or more values in the same group of exclusion '%s'" % label
                              next_path = path + [VirtualPathComponent(label)]
                              errors.append(er.ExclusiveInvalid(msg, next_path))
                              break
                          exists = True
              if errors:
                  raise er.MultipleInvalid(errors)
              for label, group in groups_of_inclusion.items():
                  included = [node.schema in data for node in group]
                  if any(included) and not all(included):
                      msg = "some but not all values in the same group of inclusion '%s'" % label
                      for g in group:
                          if hasattr(g, 'msg') and g.msg:
                              msg = g.msg
                              break
                      next_path = path + [VirtualPathComponent(label)]
                      errors.append(er.InclusiveInvalid(msg, next_path))
                      break
              if errors:
                  raise er.MultipleInvalid(errors)
              out = data.__class__()
              return base_validate(path, iteritems(data), out)
          return validate_dict