MCPcopy
hub / github.com/pydantic/pydantic / _validate_discriminated_union

Method _validate_discriminated_union

pydantic/v1/fields.py:1100–1147  ·  view source on GitHub ↗
(
        self, v: Any, values: Dict[str, Any], loc: 'LocStr', cls: Optional['ModelOrDc']
    )

Source from the content-addressed store, hash-verified

1098 return self._apply_validators(v, values, loc, cls, self.validators)
1099
1100 def _validate_discriminated_union(
1101 self, v: Any, values: Dict[str, Any], loc: 'LocStr', cls: Optional['ModelOrDc']
1102 ) -> 'ValidateReturn':
1103 assert self.discriminator_key is not None
1104 assert self.discriminator_alias is not None
1105
1106 try:
1107 try:
1108 discriminator_value = v[self.discriminator_alias]
1109 except KeyError:
1110 if self.model_config.allow_population_by_field_name:
1111 discriminator_value = v[self.discriminator_key]
1112 else:
1113 raise
1114 except KeyError:
1115 return v, ErrorWrapper(MissingDiscriminator(discriminator_key=self.discriminator_key), loc)
1116 except TypeError:
1117 try:
1118 # BaseModel or dataclass
1119 discriminator_value = getattr(v, self.discriminator_key)
1120 except (AttributeError, TypeError):
1121 return v, ErrorWrapper(MissingDiscriminator(discriminator_key=self.discriminator_key), loc)
1122
1123 if self.sub_fields_mapping is None:
1124 assert cls is not None
1125 raise ConfigError(
1126 f'field "{self.name}" not yet prepared so type is still a ForwardRef, '
1127 f'you might need to call {cls.__name__}.update_forward_refs().'
1128 )
1129
1130 try:
1131 sub_field = self.sub_fields_mapping[discriminator_value]
1132 except (KeyError, TypeError):
1133 # KeyError: `discriminator_value` is not in the dictionary.
1134 # TypeError: `discriminator_value` is unhashable.
1135 assert self.sub_fields_mapping is not None
1136 return v, ErrorWrapper(
1137 InvalidDiscriminator(
1138 discriminator_key=self.discriminator_key,
1139 discriminator_value=discriminator_value,
1140 allowed_values=list(self.sub_fields_mapping),
1141 ),
1142 loc,
1143 )
1144 else:
1145 if not isinstance(loc, tuple):
1146 loc = (loc,)
1147 return sub_field.validate(v, values, loc=(*loc, display_as_type(sub_field.type_)), cls=cls)
1148
1149 def _apply_validators(
1150 self, v: Any, values: Dict[str, Any], loc: 'LocStr', cls: Optional['ModelOrDc'], validators: 'ValidatorsList'

Callers 1

_validate_singletonMethod · 0.95

Calls 6

ErrorWrapperClass · 0.90
ConfigErrorClass · 0.90
display_as_typeFunction · 0.90
validateMethod · 0.45

Tested by

no test coverage detected