diff --git a/stdlib/argparse.pyi b/stdlib/argparse.pyi index 5a39c84dd..b9a09f56a 100644 --- a/stdlib/argparse.pyi +++ b/stdlib/argparse.pyi @@ -1,8 +1,24 @@ import sys -from typing import IO, Any, Callable, Generator, Iterable, NoReturn, Pattern, Protocol, Sequence, Tuple, Type, TypeVar, overload +from typing import ( + IO, + Any, + Callable, + Generator, + Generic, + Iterable, + NoReturn, + Pattern, + Protocol, + Sequence, + Tuple, + Type, + TypeVar, + overload, +) _T = TypeVar("_T") _ActionT = TypeVar("_ActionT", bound=Action) +_ArgumentParserT = TypeVar("_ArgumentParserT", bound=ArgumentParser) _N = TypeVar("_N") ONE_OR_MORE: str @@ -135,34 +151,63 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): @overload def parse_args(self, *, namespace: _N) -> _N: ... if sys.version_info >= (3, 7): + @overload def add_subparsers( - self, + self: _ArgumentParserT, *, title: str = ..., description: str | None = ..., prog: str = ..., - parser_class: Type[ArgumentParser] = ..., action: Type[Action] = ..., option_string: str = ..., dest: str | None = ..., required: bool = ..., help: str | None = ..., metavar: str | None = ..., - ) -> _SubParsersAction: ... - else: + ) -> _SubParsersAction[_ArgumentParserT]: ... + @overload def add_subparsers( self, *, title: str = ..., description: str | None = ..., prog: str = ..., - parser_class: Type[ArgumentParser] = ..., + parser_class: Type[_ArgumentParserT] = ..., + action: Type[Action] = ..., + option_string: str = ..., + dest: str | None = ..., + required: bool = ..., + help: str | None = ..., + metavar: str | None = ..., + ) -> _SubParsersAction[_ArgumentParserT]: ... + else: + @overload + def add_subparsers( + self: _ArgumentParserT, + *, + title: str = ..., + description: str | None = ..., + prog: str = ..., action: Type[Action] = ..., option_string: str = ..., dest: str | None = ..., help: str | None = ..., metavar: str | None = ..., - ) -> _SubParsersAction: ... + ) -> _SubParsersAction[_ArgumentParserT]: ... + @overload + def add_subparsers( + self, + *, + title: str = ..., + description: str | None = ..., + prog: str = ..., + parser_class: Type[_ArgumentParserT] = ..., + action: Type[Action] = ..., + option_string: str = ..., + dest: str | None = ..., + help: str | None = ..., + metavar: str | None = ..., + ) -> _SubParsersAction[_ArgumentParserT]: ... def print_usage(self, file: IO[str] | None = ...) -> None: ... def print_help(self, file: IO[str] | None = ...) -> None: ... def format_usage(self) -> str: ... @@ -379,19 +424,19 @@ class _VersionAction(Action): ) -> None: ... # undocumented -class _SubParsersAction(Action): +class _SubParsersAction(Action, Generic[_ArgumentParserT]): _ChoicesPseudoAction: Type[Any] # nested class _prog_prefix: str - _parser_class: Type[ArgumentParser] - _name_parser_map: dict[str, ArgumentParser] - choices: dict[str, ArgumentParser] + _parser_class: Type[_ArgumentParserT] + _name_parser_map: dict[str, _ArgumentParserT] + choices: dict[str, _ArgumentParserT] _choices_actions: list[Action] if sys.version_info >= (3, 7): def __init__( self, option_strings: Sequence[str], prog: str, - parser_class: Type[ArgumentParser], + parser_class: Type[_ArgumentParserT], dest: str = ..., required: bool = ..., help: str | None = ..., @@ -402,13 +447,13 @@ class _SubParsersAction(Action): self, option_strings: Sequence[str], prog: str, - parser_class: Type[ArgumentParser], + parser_class: Type[_ArgumentParserT], dest: str = ..., help: str | None = ..., metavar: str | Tuple[str, ...] | None = ..., ) -> None: ... # TODO: Type keyword args properly. - def add_parser(self, name: str, **kwargs: Any) -> ArgumentParser: ... + def add_parser(self, name: str, **kwargs: Any) -> _ArgumentParserT: ... def _get_subactions(self) -> list[Action]: ... # undocumented