Generic Types
Python generic types are supported, but require to_python_value
and
to_preserialization_data
implementations similar to custom types. The
class's CONVERTERS
attribute will have the appropriate datafile
converters placed in it for the specified generic types. You should use
these in your implementation to convert the marshalled data.
from typing import Generic, List, TypeVar
from datafiles import Missing, converters, datafile
from datafiles.utils import dedent
S = TypeVar("S")
T = TypeVar("T")
class Pair(Generic[S, T], converters.Converter):
first: S
second: T
def __init__(self, first: S, second: T) -> None:
self.first = first
self.second = second
@classmethod
def to_python_value(cls, deserialized_data, *, target_object=None):
paired = zip(cls.CONVERTERS, deserialized_data)
values = [convert.to_python_value(val) for convert, val in paired]
return cls(*values)
@classmethod
def to_preserialization_data(cls, python_value, *, default_to_skip=None):
values = [python_value.first, python_value.second]
paired = zip(cls.CONVERTERS, values)
return [
convert.to_preserialization_data(val)
for convert, val in paired
]
@datafile("sample.yml")
class Dictish:
contents: List[Pair[str, converters.Number]]
which can be constructed like so:
dictish = Dictish([Pair("a", 1), Pair("pi", 3.14)])
to save this sample.yml
file:
contents:
- - a
- 1
- - pi
- 3.14
An example of using generic types can be found in this notebook.