44
55import json
66import uuid
7+ from collections .abc import Callable
78from pathlib import Path
8- from typing import TYPE_CHECKING
99from typing import Any
10+ from typing import TypedDict
1011from typing import cast
1112
1213from pytask import PTask
1314from pytask import PTaskWithPath
1415
15- if TYPE_CHECKING :
16- from collections .abc import Callable
17-
1816__all__ = ["SERIALIZERS" , "create_path_to_serialized" , "serialize_keyword_arguments" ]
1917
2018_HIDDEN_FOLDER = ".pytask/pytask-r"
2119
2220
23- SERIALIZERS = {"json" : {"serializer" : json .dumps , "suffix" : ".json" }}
21+ SerializerFunc = Callable [..., str ]
22+
23+
24+ class SerializerEntry (TypedDict ):
25+ """Describe a serializer function and its output suffix."""
26+
27+ serializer : SerializerFunc
28+ suffix : str
29+
30+
31+ SERIALIZERS : dict [str , SerializerEntry ] = {
32+ "json" : {"serializer" : json .dumps , "suffix" : ".json" }
33+ }
2434
2535
2636try :
2737 import yaml
2838except ImportError : # pragma: no cover
2939 pass
3040else :
31- SERIALIZERS ["yaml" ] = {"serializer" : yaml .dump , "suffix" : ".yaml" }
32- SERIALIZERS ["yml" ] = {"serializer" : yaml .dump , "suffix" : ".yml" }
41+ yaml_dump = cast ("SerializerFunc" , yaml .dump )
42+ SERIALIZERS ["yaml" ] = {"serializer" : yaml_dump , "suffix" : ".yaml" }
43+ SERIALIZERS ["yml" ] = {"serializer" : yaml_dump , "suffix" : ".yml" }
3344
3445
3546def create_path_to_serialized (task : PTask , suffix : str ) -> Path :
@@ -42,7 +53,7 @@ def create_path_to_serialized(task: PTask, suffix: str) -> Path:
4253
4354
4455def serialize_keyword_arguments (
45- serializer : str | Callable [..., str ] ,
56+ serializer : str | SerializerFunc ,
4657 path_to_serialized : Path ,
4758 kwargs : dict [str , Any ],
4859) -> None :
@@ -51,9 +62,7 @@ def serialize_keyword_arguments(
5162 if serializer not in SERIALIZERS :
5263 msg = f"Serializer { serializer !r} is not known."
5364 raise ValueError (msg )
54- serializer_func = cast (
55- "Callable[..., str]" , SERIALIZERS [serializer ]["serializer" ]
56- )
65+ serializer_func = SERIALIZERS [serializer ]["serializer" ]
5766 elif callable (serializer ):
5867 serializer_func = serializer
5968 else :
0 commit comments