dataclasses.py 1.0 KB

123456789101112131415161718192021222324252627282930313233
  1. from dataclasses import Field, MISSING, _FIELDS, _FIELD, _FIELD_INITVAR # type: ignore
  2. from typing import Type, Any, TypeVar, List
  3. from .data import Data
  4. from .types import is_optional
  5. T = TypeVar("T", bound=Any)
  6. class DefaultValueNotFoundError(Exception):
  7. pass
  8. def get_default_value_for_field(field: Field) -> Any:
  9. if field.default != MISSING:
  10. return field.default
  11. elif field.default_factory != MISSING: # type: ignore
  12. return field.default_factory() # type: ignore
  13. elif is_optional(field.type):
  14. return None
  15. raise DefaultValueNotFoundError()
  16. def create_instance(data_class: Type[T], init_values: Data, post_init_values: Data) -> T:
  17. instance = data_class(**init_values)
  18. for key, value in post_init_values.items():
  19. setattr(instance, key, value)
  20. return instance
  21. def get_fields(data_class: Type[T]) -> List[Field]:
  22. fields = getattr(data_class, _FIELDS)
  23. return [f for f in fields.values() if f._field_type is _FIELD or f._field_type is _FIELD_INITVAR]