MCPcopy Create free account
hub / github.com/apache/fory / resolve_missing_field_default

Function resolve_missing_field_default

python/pyfory/struct.py:320–366  ·  view source on GitHub ↗
(
    dc_field: dataclasses.Field,
    type_resolver,
    type_hints: dict[str, typing.Any],
)

Source from the content-addressed store, hash-verified

318
319
320def resolve_missing_field_default(
321 dc_field: dataclasses.Field,
322 type_resolver,
323 type_hints: dict[str, typing.Any],
324) -> typing.Callable[[], typing.Any]:
325 type_hint = type_hints.get(dc_field.name, typing.Any)
326 unwrapped_type, is_optional = unwrap_optional(type_hint)
327 meta = extract_field_meta(dc_field)
328 effective_nullable = (meta.nullable if meta is not None else type_resolver.field_nullable) or is_optional
329
330 if dc_field.default is not dataclasses.MISSING:
331 default_value = dc_field.default
332 if default_value is None and not effective_nullable and is_subclass(unwrapped_type, enum.Enum):
333 members = tuple(unwrapped_type)
334 if members:
335 default_value = members[0]
336 return lambda value=default_value: value
337
338 if dc_field.default_factory is not dataclasses.MISSING:
339 return dc_field.default_factory
340
341 if not effective_nullable:
342 unwrapped_type = normalize_fory_type(unwrapped_type)
343 origin = typing.get_origin(unwrapped_type) if hasattr(typing, "get_origin") else getattr(unwrapped_type, "__origin__", None)
344 origin = origin or unwrapped_type
345 if is_subclass(unwrapped_type, enum.Enum):
346 members = tuple(unwrapped_type)
347 if members:
348 default_value = members[0]
349 return lambda value=default_value: value
350 if origin is list or origin == typing.List:
351 return lambda: []
352 if origin is set or origin == typing.Set:
353 return lambda: set()
354 if origin is dict or origin == typing.Dict:
355 return lambda: {}
356 if unwrapped_type is bool:
357 return lambda: False
358 if unwrapped_type in _MISSING_DEFAULT_INT_TYPES:
359 return lambda: 0
360 if unwrapped_type in _MISSING_DEFAULT_FLOAT_TYPES:
361 return lambda: 0.0
362 if unwrapped_type is str:
363 return lambda: ""
364 if unwrapped_type is bytes:
365 return lambda: b""
366 return lambda: None
367
368
369def _resolve_missing_field_default(dc_field, type_resolver, type_hints):

Callers 1

Calls 6

unwrap_optionalFunction · 0.90
extract_field_metaFunction · 0.90
is_subclassFunction · 0.90
normalize_fory_typeFunction · 0.90
getMethod · 0.65
setFunction · 0.50

Tested by

no test coverage detected