Skip to content

Commit f8a7a38

Browse files
author
marcus
committed
[django-environ] Use generics for CastDict. Comment on usage of Any type.
1 parent 1326a7a commit f8a7a38

1 file changed

Lines changed: 35 additions & 31 deletions

File tree

stubs/django-environ/environ/environ.pyi

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ from builtins import (
1313
)
1414
from collections.abc import Callable, Mapping, MutableMapping
1515
from 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
1717
from typing_extensions import Required, TypeAlias, Unpack
1818
from urllib.parse import ParseResult
1919

@@ -24,16 +24,17 @@ logger: Logger
2424

2525
class 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
3940
class 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

Comments
 (0)