@@ -13,7 +13,7 @@ from builtins import (
1313)
1414from collections .abc import Callable , Mapping , MutableMapping
1515from logging import Logger
16- from typing import IO , Any , ClassVar , SupportsIndex , TypedDict , TypeVar , overload , type_check_only
16+ from typing import IO , Any , ClassVar , Generic , SupportsIndex , TypedDict , TypeVar , overload , type_check_only
1717from typing_extensions import Required , TypeAlias , Unpack
1818from urllib .parse import ParseResult
1919
@@ -24,16 +24,17 @@ logger: Logger
2424
2525class NoValue : ...
2626
27- _T = TypeVar ("_T" )
28- _Cast : TypeAlias = Callable [[str ], _T ]
27+ _T1 = TypeVar ("_T1" )
28+ _T2 = TypeVar ("_T2" )
29+ _Cast : TypeAlias = Callable [[str ], _T1 ]
2930_SchemeValue : TypeAlias = _Cast [Any ] | tuple [_Cast [Any ], Any ]
3031_EmptyDict : TypeAlias = dict [object , object ] # stands for {}
3132
3233@type_check_only
33- class CastDict (TypedDict , total = False ):
34- key : _Cast [Any ]
35- value : _Cast [Any ]
36- cast : dict [str , _Cast [Any ]]
34+ class CastDict (TypedDict , Generic [ _T1 , _T2 ], total = False ):
35+ key : _Cast [_T1 ]
36+ value : _Cast [_T2 ]
37+ cast : dict [str , _Cast [Any ]] # value cast by key
3738
3839@type_check_only
3940class PathKwargs (TypedDict , total = False ):
@@ -154,21 +155,22 @@ class Env:
154155 def __init__ (self , ** scheme : _SchemeValue ) -> None : ...
155156 @overload
156157 def __call__ (
157- self , var : _str , cast : _Cast [_T ] | None = None , default : _T | NoValue = ..., parse_default : _bool = False
158- ) -> _T : ...
158+ self , var : _str , cast : _Cast [_T1 ] | None = None , default : _T1 | NoValue = ..., parse_default : _bool = False
159+ ) -> _T1 : ...
159160 @overload
160161 def __call__ (
161- self , var : _str , cast : _list [_Cast [_T ]], default : _list [_T ] | NoValue = ..., parse_default : _bool = False
162- ) -> _list [_T ]: ...
162+ self , var : _str , cast : _list [_Cast [_T1 ]], default : _list [_T1 ] | NoValue = ..., parse_default : _bool = False
163+ ) -> _list [_T1 ]: ...
163164 @overload
164165 def __call__ (
165- self , var : _str , cast : _tuple [_Cast [_T ]], default : _tuple [_T ] | NoValue = ..., parse_default : _bool = False
166- ) -> _tuple [_T ]: ...
166+ self , var : _str , cast : _tuple [_Cast [_T1 ]], default : _tuple [_T1 ] | NoValue = ..., parse_default : _bool = False
167+ ) -> _tuple [_T1 ]: ...
167168 @overload
168169 def __call__ (
169- self , var : _str , cast : CastDict , default : _dict [Any , Any ] | NoValue = ..., parse_default : _bool = False
170- ) -> _dict [Any , Any ]: ...
170+ self , var : _str , cast : CastDict [ _T1 , _T2 ], default : _dict [_T1 , _T2 ] | NoValue = ..., parse_default : _bool = False
171+ ) -> _dict [_T1 , _T2 ]: ...
171172 @overload
173+ # Any (subclass of) list/tuple/dict builtin types are valid for cast.
172174 def __call__ (
173175 self , var : _str , cast : type [_list [Any ]], default : _list [_str ] | NoValue = ..., parse_default : _bool = False
174176 ) -> _list [_str ]: ...
@@ -187,12 +189,12 @@ class Env:
187189 def int (self , var : _str , default : _int | NoValue = ...) -> _int : ...
188190 def float (self , var : _str , default : _float | NoValue = ...) -> _float : ...
189191 def json (self , var : _str , default : Any | NoValue = ...) -> Any : ...
190- def list (self , var : _str , cast : _Cast [_T ] | None = None , default : _list [_T ] | NoValue = ...) -> _list [_T ]: ...
191- def tuple (self , var : _str , cast : _Cast [_T ] | None = None , default : _tuple [_T ] | NoValue = ...) -> _tuple [_T ]: ...
192+ def list (self , var : _str , cast : _Cast [_T1 ] | None = None , default : _list [_T1 ] | NoValue = ...) -> _list [_T1 ]: ...
193+ def tuple (self , var : _str , cast : _Cast [_T1 ] | None = None , default : _tuple [_T1 ] | NoValue = ...) -> _tuple [_T1 ]: ...
192194 @overload
193195 def dict (self , var : _str , cast : None = ..., default : _dict [_str , Any ] | NoValue = ...) -> _dict [_str , Any ]: ...
194196 @overload
195- def dict (self , var : _str , cast : _Cast [_T ], default : _dict [Any , _T ] | NoValue = ...) -> _dict [Any , _T ]: ...
197+ def dict (self , var : _str , cast : _Cast [_T1 ], default : _dict [Any , _T1 ] | NoValue = ...) -> _dict [Any , _T1 ]: ...
196198 def url (self , var : _str , default : _str | NoValue = ...) -> _str : ...
197199 def db_url (
198200 self , var : _str = ..., default : _str | NoValue = ..., engine : _str | None = None
@@ -220,21 +222,22 @@ class Env:
220222 def path (self , var : _str , default : _str | NoValue = ..., ** kwargs : Unpack [PathKwargs ]) -> Path : ...
221223 @overload
222224 def get_value (
223- self , var : _str , cast : _Cast [_T ] | None = None , default : _T | NoValue = ..., parse_default : _bool = False
224- ) -> _T : ...
225+ self , var : _str , cast : _Cast [_T1 ] | None = None , default : _T1 | NoValue = ..., parse_default : _bool = False
226+ ) -> _T1 : ...
225227 @overload
226228 def get_value (
227- self , var : _str , cast : _list [_Cast [_T ]], default : _list [_T ] | NoValue = ..., parse_default : _bool = False
228- ) -> _list [_T ]: ...
229+ self , var : _str , cast : _list [_Cast [_T1 ]], default : _list [_T1 ] | NoValue = ..., parse_default : _bool = False
230+ ) -> _list [_T1 ]: ...
229231 @overload
230232 def get_value (
231- self , var : _str , cast : _tuple [_Cast [_T ]], default : _tuple [_T ] | NoValue = ..., parse_default : _bool = False
232- ) -> _tuple [_T ]: ...
233+ self , var : _str , cast : _tuple [_Cast [_T1 ]], default : _tuple [_T1 ] | NoValue = ..., parse_default : _bool = False
234+ ) -> _tuple [_T1 ]: ...
233235 @overload
234236 def get_value (
235- self , var : _str , cast : CastDict , default : _dict [Any , Any ] | NoValue = ..., parse_default : _bool = False
236- ) -> _dict [Any , Any ]: ...
237+ self , var : _str , cast : CastDict [ _T1 , _T2 ], default : _dict [_T1 , _T2 ] | NoValue = ..., parse_default : _bool = False
238+ ) -> _dict [_T1 , _T2 ]: ...
237239 @overload
240+ # Any (subclass of) list/tuple/dict builtin types are valid for cast.
238241 def get_value (
239242 self , var : _str , cast : type [_list [Any ]], default : _list [_str ] | NoValue = ..., parse_default : _bool = False
240243 ) -> _list [_str ]: ...
@@ -251,22 +254,23 @@ class Env:
251254 def parse_value (cls , value : _str , cast : None ) -> _str : ...
252255 @classmethod
253256 @overload
254- def parse_value (cls , value : _str , cast : _Cast [_T ]) -> _T : ...
257+ def parse_value (cls , value : _str , cast : _Cast [_T1 ]) -> _T1 : ...
255258 @classmethod
256259 @overload
257- def parse_value (cls , value : _str , cast : _list [_Cast [_T ]]) -> _list [_T ]: ...
260+ def parse_value (cls , value : _str , cast : _list [_Cast [_T1 ]]) -> _list [_T1 ]: ...
258261 @classmethod
259262 @overload
260- def parse_value (cls , value : _str , cast : _tuple [_Cast [_T ], ...]) -> _tuple [_T ]: ...
263+ def parse_value (cls , value : _str , cast : _tuple [_Cast [_T1 ], ...]) -> _tuple [_T1 ]: ...
261264 @classmethod
262265 @overload
263- def parse_value (cls , value : _str , cast : CastDict ) -> _dict [Any , Any ]: ...
266+ def parse_value (cls , value : _str , cast : CastDict [ _T1 , _T2 ] ) -> _dict [_T1 , _T2 ]: ...
264267 @classmethod
265268 @overload
269+ # Any (subclass of) list/tuple/dict builtin types are valid for cast.
266270 def parse_value (cls , value : _str , cast : type [_list [Any ]]) -> _list [_str ]: ...
267271 @classmethod
268272 @overload
269- def parse_value (cls , value : _str , cast : type [_tuple [Any , ...]]) -> _tuple [_str ]: ...
273+ def parse_value (cls , value : _str , cast : type [_tuple [Any , ...]]) -> _tuple [_str , ... ]: ...
270274 @classmethod
271275 @overload
272276 def parse_value (cls , value : _str , cast : type [_dict [Any , Any ]]) -> _dict [_str , _str ]: ...
0 commit comments