Skip to content

Commit b63c963

Browse files
authored
Use conditional overloads to simplify several stdlib functions (#7540)
1 parent b69d64d commit b63c963

File tree

4 files changed

+21
-36
lines changed

4 files changed

+21
-36
lines changed

stdlib/builtins.pyi

+2-4
Original file line numberDiff line numberDiff line change
@@ -1477,16 +1477,14 @@ def sorted(
14771477
) -> list[SupportsRichComparisonT]: ...
14781478
@overload
14791479
def sorted(__iterable: Iterable[_T], *, key: Callable[[_T], SupportsRichComparison], reverse: bool = ...) -> list[_T]: ...
1480+
@overload
1481+
def sum(__iterable: Iterable[_T]) -> _T | Literal[0]: ...
14801482

14811483
if sys.version_info >= (3, 8):
1482-
@overload
1483-
def sum(__iterable: Iterable[_T]) -> _T | Literal[0]: ...
14841484
@overload
14851485
def sum(__iterable: Iterable[_T], start: _S) -> _T | _S: ...
14861486

14871487
else:
1488-
@overload
1489-
def sum(__iterable: Iterable[_T]) -> _T | Literal[0]: ...
14901488
@overload
14911489
def sum(__iterable: Iterable[_T], __start: _S) -> _T | _S: ...
14921490

stdlib/dataclasses.pyi

+10-16
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,20 @@ def astuple(obj: Any) -> tuple[Any, ...]: ...
6565
@overload
6666
def astuple(obj: Any, *, tuple_factory: Callable[[list[Any]], _T]) -> _T: ...
6767

68-
if sys.version_info >= (3, 10):
68+
if sys.version_info >= (3, 8):
69+
# cls argument is now positional-only
6970
@overload
7071
def dataclass(__cls: type[_T]) -> type[_T]: ...
7172
@overload
7273
def dataclass(__cls: None) -> Callable[[type[_T]], type[_T]]: ...
74+
75+
else:
76+
@overload
77+
def dataclass(_cls: type[_T]) -> type[_T]: ...
78+
@overload
79+
def dataclass(_cls: None) -> Callable[[type[_T]], type[_T]]: ...
80+
81+
if sys.version_info >= (3, 10):
7382
@overload
7483
def dataclass(
7584
*,
@@ -84,22 +93,7 @@ if sys.version_info >= (3, 10):
8493
slots: bool = ...,
8594
) -> Callable[[type[_T]], type[_T]]: ...
8695

87-
elif sys.version_info >= (3, 8):
88-
# cls argument is now positional-only
89-
@overload
90-
def dataclass(__cls: type[_T]) -> type[_T]: ...
91-
@overload
92-
def dataclass(__cls: None) -> Callable[[type[_T]], type[_T]]: ...
93-
@overload
94-
def dataclass(
95-
*, init: bool = ..., repr: bool = ..., eq: bool = ..., order: bool = ..., unsafe_hash: bool = ..., frozen: bool = ...
96-
) -> Callable[[type[_T]], type[_T]]: ...
97-
9896
else:
99-
@overload
100-
def dataclass(_cls: type[_T]) -> type[_T]: ...
101-
@overload
102-
def dataclass(_cls: None) -> Callable[[type[_T]], type[_T]]: ...
10397
@overload
10498
def dataclass(
10599
*, init: bool = ..., repr: bool = ..., eq: bool = ..., order: bool = ..., unsafe_hash: bool = ..., frozen: bool = ...

stdlib/enum.pyi

+4-6
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,11 @@ class EnumMeta(ABCMeta):
9595
def __members__(self: type[_EnumMemberT]) -> types.MappingProxyType[str, _EnumMemberT]: ...
9696
def __len__(self) -> int: ...
9797
def __bool__(self) -> Literal[True]: ...
98+
# Simple value lookup
99+
@overload # type: ignore[override]
100+
def __call__(cls: type[_EnumMemberT], value: Any, names: None = ...) -> _EnumMemberT: ...
101+
# Functional Enum API
98102
if sys.version_info >= (3, 11):
99-
# Simple value lookup
100-
@overload # type: ignore[override]
101-
def __call__(cls: type[_EnumMemberT], value: Any, names: None = ...) -> _EnumMemberT: ...
102-
# Functional Enum API
103103
@overload
104104
def __call__(
105105
cls,
@@ -113,8 +113,6 @@ class EnumMeta(ABCMeta):
113113
boundary: FlagBoundary | None = ...,
114114
) -> type[Enum]: ...
115115
else:
116-
@overload # type: ignore[override]
117-
def __call__(cls: type[_EnumMemberT], value: Any, names: None = ...) -> _EnumMemberT: ...
118116
@overload
119117
def __call__(
120118
cls,

stdlib/os/__init__.pyi

+5-10
Original file line numberDiff line numberDiff line change
@@ -732,20 +732,15 @@ class _ScandirIterator(Iterator[DirEntry[AnyStr]], AbstractContextManager[_Scand
732732
def __exit__(self, *args: object) -> None: ...
733733
def close(self) -> None: ...
734734

735+
@overload
736+
def scandir(path: None = ...) -> _ScandirIterator[str]: ...
737+
735738
if sys.version_info >= (3, 7):
736-
@overload
737-
def scandir(path: None = ...) -> _ScandirIterator[str]: ...
738739
@overload
739740
def scandir(path: int) -> _ScandirIterator[str]: ...
740-
@overload
741-
def scandir(path: AnyStr | PathLike[AnyStr]) -> _ScandirIterator[AnyStr]: ...
742-
743-
else:
744-
@overload
745-
def scandir(path: None = ...) -> _ScandirIterator[str]: ...
746-
@overload
747-
def scandir(path: AnyStr | PathLike[AnyStr]) -> _ScandirIterator[AnyStr]: ...
748741

742+
@overload
743+
def scandir(path: AnyStr | PathLike[AnyStr]) -> _ScandirIterator[AnyStr]: ...
749744
def stat(path: _FdOrAnyPath, *, dir_fd: int | None = ..., follow_symlinks: bool = ...) -> stat_result: ...
750745

751746
if sys.version_info < (3, 7):

0 commit comments

Comments
 (0)