-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Clean up argparse hacks #13450
Clean up argparse hacks #13450
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,7 +2,7 @@ import sys | |
from _typeshed import SupportsWrite, sentinel | ||
from collections.abc import Callable, Generator, Iterable, Sequence | ||
from re import Pattern | ||
from typing import IO, Any, ClassVar, Final, Generic, NewType, NoReturn, Protocol, TypeVar, overload | ||
from typing import IO, Any, ClassVar, Final, Generic, NoReturn, Protocol, TypeVar, overload | ||
from typing_extensions import Self, TypeAlias, deprecated | ||
|
||
__all__ = [ | ||
|
@@ -33,25 +33,14 @@ _ActionT = TypeVar("_ActionT", bound=Action) | |
_ArgumentParserT = TypeVar("_ArgumentParserT", bound=ArgumentParser) | ||
_N = TypeVar("_N") | ||
_ActionType: TypeAlias = Callable[[str], Any] | FileType | str | ||
# 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 | ||
# that don't use a literal argument | ||
_ActionStr: TypeAlias = str | ||
# more precisely, Literal["?", "*", "+", "...", "A...", | ||
# "==SUPPRESS=="], but using this would make it hard to annotate | ||
# callers that don't use a literal argument | ||
_NArgsStr: TypeAlias = str | ||
Comment on lines
-41
to
-44
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Moved the comment below, there is no need for a type alias |
||
|
||
ONE_OR_MORE: Final = "+" | ||
OPTIONAL: Final = "?" | ||
PARSER: Final = "A..." | ||
REMAINDER: Final = "..." | ||
_SUPPRESS_T = NewType("_SUPPRESS_T", str) | ||
SUPPRESS: _SUPPRESS_T | str # not using Literal because argparse sometimes compares SUPPRESS with is | ||
# the | str is there so that foo = argparse.SUPPRESS; foo = "test" checks out in mypy | ||
SUPPRESS: Final = "==SUPPRESS==" | ||
Comment on lines
-50
to
+41
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This comment is obsolete, both mypy and pyright are happy with this idiom import argparse
reveal_type(argparse.SUPPRESS) # reveal "Literal['==SUPPRESS==']"
help = argparse.SUPPRESS
help = "help" Also pyright recently learned how to correctly narrow with identity checking a literal (using There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. FYI This particular change might still have been required. Removing it broke the mypyc compiled test runs. See python/mypy#18580. I partially reverted this commit in python/mypy#18683 -> python/mypy@756e61a to fix the mypy typeshed sync. |
||
ZERO_OR_MORE: Final = "*" | ||
_UNRECOGNIZED_ARGS_ATTR: Final[str] # undocumented | ||
_UNRECOGNIZED_ARGS_ATTR: Final = "_unrecognized_args" # undocumented | ||
|
||
class ArgumentError(Exception): | ||
argument_name: str | None | ||
|
@@ -86,8 +75,13 @@ class _ActionsContainer: | |
def add_argument( | ||
self, | ||
*name_or_flags: str, | ||
action: _ActionStr | type[Action] = ..., | ||
nargs: int | _NArgsStr | _SUPPRESS_T | None = None, | ||
# str covers predefined actions ("store_true", "count", etc.) | ||
# and user registered actions via the `register` method. | ||
action: str | type[Action] = ..., | ||
# more precisely, Literal["?", "*", "+", "...", "A...", "==SUPPRESS=="], | ||
# but using this would make it hard to annotate callers that don't use a | ||
# literal argument and for subclasses to override this method. | ||
nargs: int | str | None = None, | ||
const: Any = ..., | ||
default: Any = ..., | ||
type: _ActionType = ..., | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
See comment in the code below. This can never be literal because users can register actions