Interfaces¶
Base Interface metaclass
- pydantic model InterfaceMark[source]¶
JSON-able mark to be able to round-trip json dumps
Create a new model by parsing and validating input data from keyword arguments.
Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be validated to form a valid model.
self is explicitly positional-only to allow self as a field name.
- Fields:
- is_valid(cls: Type[Interface], raise_on_error: bool = False) bool[source]¶
Check that a given interface matches the mark.
- Parameters:
cls (Type) – Interface type to check
raise_on_error (bool) – Raise an
MarkMismatchErrorwhen the match is incorrect
- Returns:
bool
- Raises:
.MarkMismatchError –
for an invalid match –
- pydantic model JsonDict[source]¶
Representation of array when dumped with round_trip == True.
Developer’s Note
Any JsonDict that contains an actual array should be named
valuerather than array (or any other name), and nothing but the array data should be namedvalue.During JSON serialization, it becomes ambiguous what contains an array of data vs. an array of metadata. For the moment we would like to reserve the ability to have lists of metadata, so until we rule that out, we would like to be able to avoid iterating over every element of an array in any context parameter transformation like relativizing/absolutizing paths. To avoid that, it’s good to agree on a single value name –
value– and avoid using it for anything else.Create a new model by parsing and validating input data from keyword arguments.
Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be validated to form a valid model.
self is explicitly positional-only to allow self as a field name.
- Fields:
- classmethod handle_input(value: dict | U | W) V | W[source]¶
Handle input that is the json serialized roundtrip version (from
model_dump()withround_trip=True) converting it to the input format withJsonDict.to_array_input()or passing it through if not applicable
- pydantic model MarkedJson[source]¶
Model of JSON dumped with an additional interface mark with
model_dump_json({'mark_interface': True})Create a new model by parsing and validating input data from keyword arguments.
Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be validated to form a valid model.
self is explicitly positional-only to allow self as a field name.
- field interface: InterfaceMark [Required]¶
- field value: list | dict [Required]¶
Inner value of the array, we don’t validate for JsonDict here, that should be downstream from us for performance reasons
- classmethod try_cast(value: V | dict) V | MarkedJson[source]¶
Try to cast to MarkedJson if applicable, otherwise return input
- class Interface(shape: Tuple[int, ...] | Any = typing.Any, dtype: str | type | Any | generic = typing.Any)[source]¶
Abstract parent class for interfaces to different array formats
- validate(array: Any) T[source]¶
Validate input, returning final array type
Calls the methods, in order:
array =
deserialize()(array)array =
before_validation()(array)- dtype =
get_dtype()(array) - get the dtype from the array, override if eg. the dtype is not contained in
array.dtype
- dtype =
- valid =
validate_dtype()(dtype) - check that the dtype matches the one in the NDArray specification. Override if special validation logic is needed for a given format
- valid =
raise_for_dtype()(valid, dtype) - after checking dtype validity,raise an exception if it was invalid. Override to implement custom exceptions or error conditions, or make validation errors conditional.
- array =
after_validate_dtype()(array) - hook for additional validation or array modification mid-validation
- array =
- shape =
get_shape()(array) - get the shape from the array, override if eg. the shape is not contained in
array.shape
- shape =
- valid =
validate_shape()(shape) - check that the shape matches the one in the NDArray specification. Override if special validation logic is needed.
- valid =
raise_for_shape()(valid, shape) - after checking shape validity,raise an exception if it was invalid. You know the deal bc it’s the same as raise for dtype.
after_validation()- hook after validation for modifying the arraythat is set as the model field value
Follow the method signatures and return types to override.
Implementing an interface subclass largely consists of overriding these methods as needed.
- Raises:
If validation fails, rather than eg. returning False, exceptions will –
be raised (to halt the rest of the pydantic validation process). –
When using interfaces outside of pydantic, you must catch both –
.DtypeError –
:raises of
InterfaceError):
- deserialize(array: Any) V | Any[source]¶
If given a JSON serialized version of the array, deserialize it first.
If a roundtrip-serialized
JsonDict, pass toJsonDict.handle_input().If a roundtrip-serialized
MarkedJson, unpack mark, check for validity, warn if not, and try to continue with validation
- before_validation(array: Any) NDArrayType[source]¶
Optional step pre-validation that coerces the input into a type that can be validated for shape and dtype
Default method is a no-op
- get_dtype(array: NDArrayType) str | type | Any | generic[source]¶
Get the dtype from the input array
- get_object_dtype(array: NDArrayType) str | type | Any | generic[source]¶
When an array contains an object, get the dtype of the object contained by the array.
- validate_dtype(dtype: str | type | Any | generic) bool[source]¶
Validate the dtype of the given array, returning
Trueif valid,Falseif not.
- raise_for_dtype(valid: bool, dtype: str | type | Any | generic) None[source]¶
After validating, raise an exception if invalid :raises ~numpydantic.exceptions.DtypeError:
- after_validate_dtype(array: NDArrayType) NDArrayType[source]¶
Hook to modify array after validating dtype. Default is a no-op.
- get_shape(array: NDArrayType) Tuple[int, ...][source]¶
Get the shape from the array as a tuple of integers
- validate_shape(shape: Tuple[int, ...]) bool[source]¶
Validate the shape of the given array against the shape specifier, returning
Trueif valid,Falseif not.
- raise_for_shape(valid: bool, shape: Tuple[int, ...]) None[source]¶
Raise a ShapeError if the shape is invalid.
- Raises:
ShapeError –
- after_validation(array: NDArrayType) T[source]¶
Optional step post-validation that coerces the intermediate array type into the return type
Default method is a no-op
- abstract classmethod check(array: Any) bool[source]¶
Method to check whether a given input applies to this interface
- abstract classmethod enabled() bool[source]¶
Check whether this array interface can be used (eg. its dependent packages are installed, etc.)
- abstract property json_model: JsonDict¶
The
JsonDictmodel used for roundtripping JSON serialization
- abstract classmethod to_json(array: Type[T], info: SerializationInfo) list | JsonDict[source]¶
Convert an array of
return_typeto a JSON-compatible format using base python types
- classmethod mark_json(array: list | dict) dict[source]¶
When using
model_dump_jsonwithmark_interface: Truein thecontext, add additional annotations that would allow the serialized array to be roundtripped.Default is just to add an
InterfaceMarkExamples
>>> from pprint import pprint >>> pprint(Interface.mark_json([1.0, 2.0])) {'interface': {'cls': 'Interface', 'module': 'numpydantic.interface.interface', 'version': '1.2.2'}, 'value': [1.0, 2.0]}
- classmethod interfaces(with_disabled: bool = False, sort: bool = True) Tuple[Type[Interface], ...][source]¶
Enabled interface subclasses
- classmethod return_types() Tuple[NDArrayType, ...][source]¶
Return types for all enabled interfaces
- classmethod match_mark(array: Any) Type[Interface] | None[source]¶
Match a marked JSON dump of this array to the interface that it indicates.
First find an interface that matches by name, and then run its
checkmethod, because arrays can be dumped with a mark but withoutround_trip == True(and thus can’t necessarily use the same interface that they were dumped with)- Returns:
Interface if match found, None otherwise
- classmethod match(array: Any, fast: bool = False) Type[Interface][source]¶
Find the interface that should be used for this array based on its input type
First runs the
checkmethod for all interfaces returned byInterface.interfaces()except forNumpyInterface, and if no match is found then try the numpy interface. This is becauseNumpyInterface.check()can be expensive, as we could potentially try to- Parameters:
fast (bool) – if
False, check all interfaces and raise exceptions for having multiple matching interfaces (default). IfTrue, check each interface (as ordered by itspriority, decreasing), and return on the first match.
- classmethod match_output(array: Any) Type[Interface][source]¶
Find the interface that should be used based on the output type - in the case that the output type differs from the input type, eg. the HDF5 interface, match an instantiated array for purposes of serialization to json, etc.
- classmethod mark_interface() InterfaceMark[source]¶
Create an interface mark indicating this interface for validation after JSON serialization with
round_trip==True