(
self,
type_resolver,
clz: type,
field_names: List[str] = None,
serializers: List[Serializer] = None,
nullable_fields: Dict[str, bool] = None,
dynamic_fields: Dict[str, bool] = None,
ref_fields: Dict[str, bool] = None,
field_infos: List[FieldInfo] = None,
fields_from_typedef: bool = False,
)
| 387 | ) |
| 388 | |
| 389 | def __init__( |
| 390 | self, |
| 391 | type_resolver, |
| 392 | clz: type, |
| 393 | field_names: List[str] = None, |
| 394 | serializers: List[Serializer] = None, |
| 395 | nullable_fields: Dict[str, bool] = None, |
| 396 | dynamic_fields: Dict[str, bool] = None, |
| 397 | ref_fields: Dict[str, bool] = None, |
| 398 | field_infos: List[FieldInfo] = None, |
| 399 | fields_from_typedef: bool = False, |
| 400 | ): |
| 401 | super().__init__(type_resolver, clz) |
| 402 | |
| 403 | self._type_hints = get_type_hints(clz) |
| 404 | self._has_slots = hasattr(clz, "__slots__") |
| 405 | |
| 406 | self._fields_from_typedef = fields_from_typedef or (field_names is not None and serializers is not None) |
| 407 | if field_infos is not None: |
| 408 | self._field_infos = list(field_infos) |
| 409 | self._field_names = [fi.name for fi in self._field_infos] |
| 410 | self._serializers = [fi.serializer for fi in self._field_infos] |
| 411 | self._nullable_fields = {fi.name: fi.nullable for fi in self._field_infos} |
| 412 | self._ref_fields = {fi.name: fi.runtime_ref_tracking for fi in self._field_infos} |
| 413 | self._dynamic_fields = {fi.name: fi.dynamic for fi in self._field_infos} |
| 414 | self._field_metas = {} |
| 415 | elif self._fields_from_typedef: |
| 416 | self._field_names = list(field_names) |
| 417 | self._serializers = list(serializers) |
| 418 | self._nullable_fields = nullable_fields or {} |
| 419 | self._ref_fields = ref_fields or {} |
| 420 | self._dynamic_fields = dynamic_fields or {} |
| 421 | self._field_infos = [] |
| 422 | self._field_metas = {} |
| 423 | else: |
| 424 | self._field_infos, self._field_metas = _extract_field_infos(type_resolver, clz, self._type_hints) |
| 425 | if self._field_infos: |
| 426 | self._field_names = [fi.name for fi in self._field_infos] |
| 427 | self._serializers = [fi.serializer for fi in self._field_infos] |
| 428 | self._nullable_fields = {fi.name: fi.nullable for fi in self._field_infos} |
| 429 | self._ref_fields = {fi.name: fi.runtime_ref_tracking for fi in self._field_infos} |
| 430 | self._dynamic_fields = {fi.name: fi.dynamic for fi in self._field_infos} |
| 431 | else: |
| 432 | self._field_names = field_names or self._get_field_names(clz) |
| 433 | self._nullable_fields = nullable_fields or {} |
| 434 | self._ref_fields = {} |
| 435 | self._dynamic_fields = {} |
| 436 | if self._field_names and not self._nullable_fields: |
| 437 | for field_name in self._field_names: |
| 438 | if field_name in self._type_hints: |
| 439 | unwrapped_type, is_optional = unwrap_optional(self._type_hints[field_name]) |
| 440 | self._nullable_fields[field_name] = is_optional or not is_primitive_type(unwrapped_type) |
| 441 | self._serializers = serializers or [None] * len(self._field_names) |
| 442 | if serializers is None: |
| 443 | visitor = StructFieldSerializerVisitor(type_resolver) |
| 444 | for index, key in enumerate(self._field_names): |
| 445 | unwrapped_type, _ = unwrap_optional(self._type_hints.get(key, typing.Any)) |
| 446 | self._serializers[index] = infer_field(key, unwrapped_type, visitor, types_path=[]) |
nothing calls this directly
no test coverage detected