chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
from dataclasses import Field, MISSING, _FIELDS, _FIELD, _FIELD_INITVAR # type: ignore
|
||||
from typing import Type, Any, TypeVar, List
|
||||
|
||||
from .data import Data
|
||||
from .types import is_optional
|
||||
|
||||
T = TypeVar("T", bound=Any)
|
||||
|
||||
|
||||
class DefaultValueNotFoundError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
def get_default_value_for_field(field: Field) -> Any:
|
||||
if field.default != MISSING:
|
||||
return field.default
|
||||
elif field.default_factory != MISSING: # type: ignore
|
||||
return field.default_factory() # type: ignore
|
||||
elif is_optional(field.type):
|
||||
return None
|
||||
raise DefaultValueNotFoundError()
|
||||
|
||||
|
||||
def create_instance(data_class: Type[T], init_values: Data, post_init_values: Data) -> T:
|
||||
instance = data_class(**init_values)
|
||||
for key, value in post_init_values.items():
|
||||
setattr(instance, key, value)
|
||||
return instance
|
||||
|
||||
|
||||
def get_fields(data_class: Type[T]) -> List[Field]:
|
||||
fields = getattr(data_class, _FIELDS)
|
||||
return [f for f in fields.values() if f._field_type is _FIELD or f._field_type is _FIELD_INITVAR]
|
||||
Reference in New Issue
Block a user