From 838fc97de98b208797f7d8b6600d7427e5a9e5fe Mon Sep 17 00:00:00 2001 From: qthequartermasterman Date: Mon, 12 Jun 2023 06:14:12 -0500 Subject: [PATCH 1/6] add overloads for argparse functions that take a namespace to return a typevar bound to the input namespace --- stdlib/argparse.pyi | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/stdlib/argparse.pyi b/stdlib/argparse.pyi index 8e6f9da8ef26..616e3bb451b3 100644 --- a/stdlib/argparse.pyi +++ b/stdlib/argparse.pyi @@ -209,13 +209,27 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): def print_help(self, file: IO[str] | None = None) -> None: ... def format_usage(self) -> str: ... def format_help(self) -> str: ... + @overload + def parse_known_args( + self, args: Sequence[str] | None, namespace: _N + ) -> tuple[_N, list[str]]: ... + @overload def parse_known_args( self, args: Sequence[str] | None = None, namespace: Namespace | None = None ) -> tuple[Namespace, list[str]]: ... def convert_arg_line_to_args(self, arg_line: str) -> list[str]: ... def exit(self, status: int = 0, message: str | None = None) -> NoReturn: ... def error(self, message: str) -> NoReturn: ... + @overload + + def parse_intermixed_args(self, args: Sequence[str] | None, namespace: _N) -> _N: ... + @overload def parse_intermixed_args(self, args: Sequence[str] | None = None, namespace: Namespace | None = None) -> Namespace: ... + @overload + def parse_known_intermixed_args( + self, args: Sequence[str] | None, namespace: _N + ) -> tuple[_N, list[str]]: ... + @overload def parse_known_intermixed_args( self, args: Sequence[str] | None = None, namespace: Namespace | None = None ) -> tuple[Namespace, list[str]]: ... From 7333d56f803aa98328e9fbc1f6f1c6fa16a79cfb Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 11:19:41 +0000 Subject: [PATCH 2/6] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/argparse.pyi | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/stdlib/argparse.pyi b/stdlib/argparse.pyi index 616e3bb451b3..b042ca14fd01 100644 --- a/stdlib/argparse.pyi +++ b/stdlib/argparse.pyi @@ -210,9 +210,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): def format_usage(self) -> str: ... def format_help(self) -> str: ... @overload - def parse_known_args( - self, args: Sequence[str] | None, namespace: _N - ) -> tuple[_N, list[str]]: ... + def parse_known_args(self, args: Sequence[str] | None, namespace: _N) -> tuple[_N, list[str]]: ... @overload def parse_known_args( self, args: Sequence[str] | None = None, namespace: Namespace | None = None @@ -221,14 +219,11 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): def exit(self, status: int = 0, message: str | None = None) -> NoReturn: ... def error(self, message: str) -> NoReturn: ... @overload - def parse_intermixed_args(self, args: Sequence[str] | None, namespace: _N) -> _N: ... @overload def parse_intermixed_args(self, args: Sequence[str] | None = None, namespace: Namespace | None = None) -> Namespace: ... @overload - def parse_known_intermixed_args( - self, args: Sequence[str] | None, namespace: _N - ) -> tuple[_N, list[str]]: ... + def parse_known_intermixed_args(self, args: Sequence[str] | None, namespace: _N) -> tuple[_N, list[str]]: ... @overload def parse_known_intermixed_args( self, args: Sequence[str] | None = None, namespace: Namespace | None = None From 607b16f071aab3e4378e23b5ef58a43291b05307 Mon Sep 17 00:00:00 2001 From: qthequartermasterman Date: Mon, 12 Jun 2023 06:34:51 -0500 Subject: [PATCH 3/6] bind namespace typevar --- stdlib/argparse.pyi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/stdlib/argparse.pyi b/stdlib/argparse.pyi index b042ca14fd01..23233464d684 100644 --- a/stdlib/argparse.pyi +++ b/stdlib/argparse.pyi @@ -30,7 +30,7 @@ if sys.version_info >= (3, 9): _T = TypeVar("_T") _ActionT = TypeVar("_ActionT", bound=Action) _ArgumentParserT = TypeVar("_ArgumentParserT", bound=ArgumentParser) -_N = TypeVar("_N") +_N = TypeVar("_N", bound=Namespace) # more precisely, Literal["store", "store_const", "store_true", # "store_false", "append", "append_const", "count", "help", "version", # "extend"], but using this would make it hard to annotate callers @@ -171,10 +171,10 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): ) -> None: ... # Ignore errors about overlapping overloads @overload - def parse_args(self, args: Sequence[str] | None = None, namespace: None = None) -> Namespace: ... # type: ignore[misc] - @overload def parse_args(self, args: Sequence[str] | None, namespace: _N) -> _N: ... @overload + def parse_args(self, args: Sequence[str] | None = None, namespace: None = None) -> Namespace: ... + @overload def parse_args(self, *, namespace: _N) -> _N: ... @overload def add_subparsers( From 884991378ba5e3d6909b1864d44c04446ebce07c Mon Sep 17 00:00:00 2001 From: qthequartermasterman Date: Mon, 12 Jun 2023 09:38:15 -0500 Subject: [PATCH 4/6] add namespace only typehint to argparse and remove namespace typevar bind --- stdlib/argparse.pyi | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/stdlib/argparse.pyi b/stdlib/argparse.pyi index 23233464d684..bc28fdd307ce 100644 --- a/stdlib/argparse.pyi +++ b/stdlib/argparse.pyi @@ -30,7 +30,7 @@ if sys.version_info >= (3, 9): _T = TypeVar("_T") _ActionT = TypeVar("_ActionT", bound=Action) _ArgumentParserT = TypeVar("_ArgumentParserT", bound=ArgumentParser) -_N = TypeVar("_N", bound=Namespace) +_N = TypeVar("_N") # more precisely, Literal["store", "store_const", "store_true", # "store_false", "append", "append_const", "count", "help", "version", # "extend"], but using this would make it hard to annotate callers @@ -169,11 +169,10 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): add_help: bool = True, allow_abbrev: bool = True, ) -> None: ... - # Ignore errors about overlapping overloads @overload - def parse_args(self, args: Sequence[str] | None, namespace: _N) -> _N: ... + def parse_args(self, args: Sequence[str] | None = None, namespace: None = None) -> Namespace: ... # type: ignore[misc] @overload - def parse_args(self, args: Sequence[str] | None = None, namespace: None = None) -> Namespace: ... + def parse_args(self, args: Sequence[str] | None, namespace: _N) -> _N: ... @overload def parse_args(self, *, namespace: _N) -> _N: ... @overload @@ -210,24 +209,26 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): def format_usage(self) -> str: ... def format_help(self) -> str: ... @overload + def parse_known_args(self, args: Sequence[str] | None = None, namespace: None = None) -> tuple[Namespace, list[str]]: ... # type: ignore[misc] + @overload def parse_known_args(self, args: Sequence[str] | None, namespace: _N) -> tuple[_N, list[str]]: ... @overload - def parse_known_args( - self, args: Sequence[str] | None = None, namespace: Namespace | None = None - ) -> tuple[Namespace, list[str]]: ... + def parse_known_args(self, *, namespace: _N) -> tuple[_N, list[str]]: ... def convert_arg_line_to_args(self, arg_line: str) -> list[str]: ... def exit(self, status: int = 0, message: str | None = None) -> NoReturn: ... def error(self, message: str) -> NoReturn: ... @overload + def parse_intermixed_args(self, args: Sequence[str] | None = None, namespace: None = None) -> Namespace: ... # type: ignore[misc] + @overload def parse_intermixed_args(self, args: Sequence[str] | None, namespace: _N) -> _N: ... @overload - def parse_intermixed_args(self, args: Sequence[str] | None = None, namespace: Namespace | None = None) -> Namespace: ... + def parse_intermixed_args(self, *, namespace: _N) -> _N: ... + @overload + def parse_known_intermixed_args(self, args: Sequence[str] | None = None, namespace: None = None) -> tuple[Namespace, list[str]]: ... # type: ignore[misc] @overload def parse_known_intermixed_args(self, args: Sequence[str] | None, namespace: _N) -> tuple[_N, list[str]]: ... @overload - def parse_known_intermixed_args( - self, args: Sequence[str] | None = None, namespace: Namespace | None = None - ) -> tuple[Namespace, list[str]]: ... + def parse_known_intermixed_args(self, *, namespace: _N) -> tuple[_N, list[str]]: ... # undocumented def _get_optional_actions(self) -> list[Action]: ... def _get_positional_actions(self) -> list[Action]: ... From c74b4ce4d4a73ab0dbfb3dcda4240357f4046c03 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 14:41:12 +0000 Subject: [PATCH 5/6] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/argparse.pyi | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/stdlib/argparse.pyi b/stdlib/argparse.pyi index bc28fdd307ce..182f96bd0432 100644 --- a/stdlib/argparse.pyi +++ b/stdlib/argparse.pyi @@ -169,6 +169,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): add_help: bool = True, allow_abbrev: bool = True, ) -> None: ... + @overload def parse_args(self, args: Sequence[str] | None = None, namespace: None = None) -> Namespace: ... # type: ignore[misc] @overload @@ -209,7 +210,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): def format_usage(self) -> str: ... def format_help(self) -> str: ... @overload - def parse_known_args(self, args: Sequence[str] | None = None, namespace: None = None) -> tuple[Namespace, list[str]]: ... # type: ignore[misc] + def parse_known_args(self, args: Sequence[str] | None = None, namespace: None = None) -> tuple[Namespace, list[str]]: ... # type: ignore[misc] @overload def parse_known_args(self, args: Sequence[str] | None, namespace: _N) -> tuple[_N, list[str]]: ... @overload @@ -218,13 +219,13 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): def exit(self, status: int = 0, message: str | None = None) -> NoReturn: ... def error(self, message: str) -> NoReturn: ... @overload - def parse_intermixed_args(self, args: Sequence[str] | None = None, namespace: None = None) -> Namespace: ... # type: ignore[misc] + def parse_intermixed_args(self, args: Sequence[str] | None = None, namespace: None = None) -> Namespace: ... # type: ignore[misc] @overload def parse_intermixed_args(self, args: Sequence[str] | None, namespace: _N) -> _N: ... @overload def parse_intermixed_args(self, *, namespace: _N) -> _N: ... @overload - def parse_known_intermixed_args(self, args: Sequence[str] | None = None, namespace: None = None) -> tuple[Namespace, list[str]]: ... # type: ignore[misc] + def parse_known_intermixed_args(self, args: Sequence[str] | None = None, namespace: None = None) -> tuple[Namespace, list[str]]: ... # type: ignore[misc] @overload def parse_known_intermixed_args(self, args: Sequence[str] | None, namespace: _N) -> tuple[_N, list[str]]: ... @overload From 71db96570416b6c34764ea999e3ba72a64102e28 Mon Sep 17 00:00:00 2001 From: qthequartermasterman Date: Mon, 12 Jun 2023 10:10:16 -0500 Subject: [PATCH 6/6] change namespace None overload hint to optional namespace --- stdlib/argparse.pyi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/stdlib/argparse.pyi b/stdlib/argparse.pyi index 182f96bd0432..e41048516dd9 100644 --- a/stdlib/argparse.pyi +++ b/stdlib/argparse.pyi @@ -171,7 +171,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): ) -> None: ... @overload - def parse_args(self, args: Sequence[str] | None = None, namespace: None = None) -> Namespace: ... # type: ignore[misc] + def parse_args(self, args: Sequence[str] | None = None, namespace: Namespace | None = None) -> Namespace: ... # type: ignore[misc] @overload def parse_args(self, args: Sequence[str] | None, namespace: _N) -> _N: ... @overload @@ -210,7 +210,7 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): def format_usage(self) -> str: ... def format_help(self) -> str: ... @overload - def parse_known_args(self, args: Sequence[str] | None = None, namespace: None = None) -> tuple[Namespace, list[str]]: ... # type: ignore[misc] + def parse_known_args(self, args: Sequence[str] | None = None, namespace: Namespace | None = None) -> tuple[Namespace, list[str]]: ... # type: ignore[misc] @overload def parse_known_args(self, args: Sequence[str] | None, namespace: _N) -> tuple[_N, list[str]]: ... @overload @@ -219,13 +219,13 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): def exit(self, status: int = 0, message: str | None = None) -> NoReturn: ... def error(self, message: str) -> NoReturn: ... @overload - def parse_intermixed_args(self, args: Sequence[str] | None = None, namespace: None = None) -> Namespace: ... # type: ignore[misc] + def parse_intermixed_args(self, args: Sequence[str] | None = None, namespace: Namespace | None = None) -> Namespace: ... # type: ignore[misc] @overload def parse_intermixed_args(self, args: Sequence[str] | None, namespace: _N) -> _N: ... @overload def parse_intermixed_args(self, *, namespace: _N) -> _N: ... @overload - def parse_known_intermixed_args(self, args: Sequence[str] | None = None, namespace: None = None) -> tuple[Namespace, list[str]]: ... # type: ignore[misc] + def parse_known_intermixed_args(self, args: Sequence[str] | None = None, namespace: Namespace | None = None) -> tuple[Namespace, list[str]]: ... # type: ignore[misc] @overload def parse_known_intermixed_args(self, args: Sequence[str] | None, namespace: _N) -> tuple[_N, list[str]]: ... @overload