Skip to content

Commit c506574

Browse files
authored
Non-parsing actions now have a common base class to ease identification (#793)
1 parent 536c853 commit c506574

File tree

7 files changed

+37
-34
lines changed

7 files changed

+37
-34
lines changed

CHANGELOG.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ Changed
3333
- Moved location of ``Path`` class from ``jsonargparse`` to
3434
``jsonargparse.typing`` (`#792
3535
<https://github.com/omni-us/jsonargparse/pull/792>`__).
36+
- Non-parsing actions now have a common base class to ease identification
37+
(`#793 <https://github.com/omni-us/jsonargparse/pull/793>`__).
3638

3739

3840
v4.42.0 (2025-10-14)

jsonargparse/_actions.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
import re
44
import sys
55
import warnings
6-
from argparse import SUPPRESS, _HelpAction, _SubParsersAction
6+
from argparse import SUPPRESS, _HelpAction, _SubParsersAction, _VersionAction
77
from argparse import Action as ArgparseAction
88
from contextlib import contextmanager
99
from contextvars import ContextVar
1010
from typing import Any, Dict, List, Optional, Tuple, Type, Union
1111

12-
from ._common import Action, is_not_subclass_type, is_subclass, parser_context
12+
from ._common import Action, NonParsingAction, is_not_subclass_type, is_subclass, parser_context
1313
from ._loaders_dumpers import get_loader_exceptions, load_value
1414
from ._namespace import Namespace, NSKeyError, split_key, split_key_root
1515
from ._optionals import _get_config_read_mode, ruamel_support
@@ -36,7 +36,7 @@
3636

3737
def _is_branch_key(parser, key: str) -> bool:
3838
root_key = split_key_root(key)[0]
39-
for action in filter_default_actions(parser._actions):
39+
for action in filter_non_parsing_actions(parser._actions):
4040
if isinstance(action, _ActionSubCommands) and root_key in action._name_parser_map:
4141
subparser = action._name_parser_map[root_key]
4242
return _is_branch_key(subparser, split_key_root(key)[1])
@@ -59,7 +59,7 @@ def _find_action_and_subcommand(
5959
Returns:
6060
The action if found, otherwise None.
6161
"""
62-
actions = filter_default_actions(parser._actions)
62+
actions = filter_non_parsing_actions(parser._actions)
6363
if exclude is not None:
6464
actions = [a for a in actions if not isinstance(a, exclude)]
6565
fallback_action = None
@@ -138,13 +138,13 @@ def remove(actions):
138138
remove(action_group._group_actions)
139139

140140

141-
def filter_default_actions(actions):
142-
from ._completions import ShtabAction
141+
non_parsing_actions = (_HelpAction, _VersionAction, NonParsingAction)
143142

144-
default = (_HelpAction, _ActionHelpClassPath, _ActionPrintConfig, ShtabAction)
143+
144+
def filter_non_parsing_actions(actions):
145145
if isinstance(actions, list):
146-
return [a for a in actions if not isinstance(a, default)]
147-
return {k: a for k, a in actions.items() if not isinstance(a, default)}
146+
return [a for a in actions if not isinstance(a, non_parsing_actions)]
147+
return {k: a for k, a in actions.items() if not isinstance(a, non_parsing_actions)}
148148

149149

150150
class ActionConfigFile(Action):
@@ -235,7 +235,7 @@ def previous_config_context(cfg):
235235
print_config_skip: ContextVar = ContextVar("print_config_skip", default=False)
236236

237237

238-
class _ActionPrintConfig(Action):
238+
class _ActionPrintConfig(NonParsingAction):
239239
def __init__(
240240
self,
241241
option_strings,
@@ -343,7 +343,7 @@ def check_type(self, value, parser):
343343
return self._load_config(value, parser)
344344

345345

346-
class _ActionHelpClassPath(Action):
346+
class _ActionHelpClassPath(NonParsingAction):
347347
sub_add_kwargs: Dict[str, Any] = {}
348348

349349
@classmethod
@@ -586,7 +586,7 @@ def add_prefix(key):
586586
required_args = {prefix + "." + x for x in subparser.required_args}
587587

588588
option_string_actions = {}
589-
for key, action in filter_default_actions(subparser._option_string_actions).items():
589+
for key, action in filter_non_parsing_actions(subparser._option_string_actions).items():
590590
option_string_actions[add_prefix(key)] = action
591591

592592
isect = set(option_string_actions).intersection(set(parser._option_string_actions))
@@ -595,7 +595,7 @@ def add_prefix(key):
595595

596596
actions = []
597597
dest = prefix.replace("-", "_")
598-
for action in filter_default_actions(subparser._actions):
598+
for action in filter_non_parsing_actions(subparser._actions):
599599
if isinstance(action, ActionYesNo):
600600
action._add_dest_prefix(prefix)
601601
else:
@@ -608,8 +608,8 @@ def add_prefix(key):
608608
if description is not None:
609609
base_action_group.description = description
610610
base_action_group.parser = parser
611-
base_action_group._actions = filter_default_actions(base_action_group._actions)
612-
base_action_group._group_actions = filter_default_actions(base_action_group._group_actions)
611+
base_action_group._actions = filter_non_parsing_actions(base_action_group._actions)
612+
base_action_group._group_actions = filter_non_parsing_actions(base_action_group._group_actions)
613613
extra_action_groups = subparser._action_groups[2:]
614614
for group in extra_action_groups:
615615
if group.dest is not None:

jsonargparse/_common.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,12 +200,12 @@ def validate_default(container: ActionsContainer, action: argparse.Action):
200200

201201

202202
def get_optionals_as_positionals_actions(parser, include_positionals=False):
203-
from jsonargparse._actions import ActionConfigFile, _ActionConfigLoad, filter_default_actions
203+
from jsonargparse._actions import ActionConfigFile, _ActionConfigLoad, filter_non_parsing_actions
204204
from jsonargparse._completions import ShtabAction
205205
from jsonargparse._typehints import ActionTypeHint
206206

207207
actions = []
208-
for action in filter_default_actions(parser._actions):
208+
for action in filter_non_parsing_actions(parser._actions):
209209
if isinstance(action, (_ActionConfigLoad, ActionConfigFile, ShtabAction)):
210210
continue
211211
if ActionTypeHint.is_subclass_typehint(action, all_subtypes=False):
@@ -431,3 +431,7 @@ def _check_type_(self, value, **kwargs):
431431
self._check_type_kwargs = set(inspect.signature(self._check_type).parameters)
432432
kwargs = {k: v for k, v in kwargs.items() if k in self._check_type_kwargs}
433433
return self._check_type(value, **kwargs)
434+
435+
436+
class NonParsingAction(Action):
437+
"""Base for jsonargparse utility Action classes."""

jsonargparse/_completions.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from typing import List, Literal, Union
1414

1515
from ._actions import ActionConfigFile, _ActionConfigLoad, _ActionHelpClassPath, remove_actions
16-
from ._common import get_optionals_as_positionals_actions, get_parsing_setting
16+
from ._common import NonParsingAction, get_optionals_as_positionals_actions, get_parsing_setting
1717
from ._parameter_resolvers import get_signature_parameters
1818
from ._typehints import (
1919
ActionTypeHint,
@@ -78,7 +78,7 @@ def argcomplete_warn_redraw_prompt(prefix, message):
7878
shtab_preambles: ContextVar = ContextVar("shtab_preambles")
7979

8080

81-
class ShtabAction(argparse.Action):
81+
class ShtabAction(NonParsingAction):
8282
def __init__(
8383
self,
8484
option_strings,

jsonargparse/_core.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
_find_parent_action_and_subcommand,
3333
_is_action_value_list,
3434
_is_branch_key,
35-
filter_default_actions,
35+
filter_non_parsing_actions,
3636
parent_parsers,
3737
previous_config,
3838
)
@@ -531,7 +531,7 @@ def parse_object(
531531

532532
def _load_env_vars(self, env: Union[Dict[str, str], os._Environ], defaults: bool) -> Namespace:
533533
cfg = Namespace()
534-
actions = filter_default_actions(self._actions)
534+
actions = filter_non_parsing_actions(self._actions)
535535
for action in actions:
536536
env_var = get_env_var(self, action)
537537
if env_var in env and isinstance(action, ActionConfigFile):
@@ -818,7 +818,7 @@ def dump(
818818

819819
def _dump_cleanup_actions(self, cfg, actions, dump_kwargs, prefix=""):
820820
skip_none = dump_kwargs["skip_none"]
821-
for action in filter_default_actions(actions):
821+
for action in filter_non_parsing_actions(actions):
822822
action_dest = prefix + action.dest
823823
if (
824824
(action.help == argparse.SUPPRESS and not isinstance(action, _ActionConfigLoad))
@@ -1032,7 +1032,7 @@ def get_defaults(self, skip_validation: bool = False, **kwargs) -> Namespace:
10321032
"""
10331033
skip_validation = deprecated_skip_check(ArgumentParser.get_defaults, kwargs, skip_validation)
10341034
cfg = Namespace()
1035-
for action in filter_default_actions(self._actions):
1035+
for action in filter_non_parsing_actions(self._actions):
10361036
if (
10371037
action.default != argparse.SUPPRESS
10381038
and action.dest != argparse.SUPPRESS
@@ -1245,7 +1245,7 @@ def instantiate_classes(
12451245
A configuration object with all subclasses and class groups instantiated.
12461246
"""
12471247
components: List[Union[ActionTypeHint, _ActionConfigLoad, ArgumentGroup]] = []
1248-
for action in filter_default_actions(self._actions):
1248+
for action in filter_non_parsing_actions(self._actions):
12491249
if isinstance(action, ActionTypeHint):
12501250
components.append(action)
12511251

@@ -1324,7 +1324,7 @@ def get_config_files(self, cfg: Namespace) -> List[str]:
13241324
cfg_files = []
13251325
if "__default_config__" in cfg:
13261326
cfg_files.append(cfg["__default_config__"])
1327-
for action in filter_default_actions(self._actions):
1327+
for action in filter_non_parsing_actions(self._actions):
13281328
if isinstance(action, ActionConfigFile) and action.dest in cfg and cfg[action.dest] is not None:
13291329
cfg_files.extend(p for p in cfg[action.dest] if p is not None)
13301330
return cfg_files

jsonargparse/_formatters.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
HelpFormatter,
1010
_HelpAction,
1111
_SubParsersAction,
12-
_VersionAction,
1312
)
1413
from io import StringIO
1514
from string import Template
@@ -19,19 +18,17 @@
1918
ActionConfigFile,
2019
ActionYesNo,
2120
_ActionConfigLoad,
22-
_ActionHelpClassPath,
23-
_ActionPrintConfig,
2421
_ActionSubCommands,
2522
_find_action,
26-
filter_default_actions,
23+
filter_non_parsing_actions,
24+
non_parsing_actions,
2725
)
2826
from ._common import (
2927
defaults_cache,
3028
get_optionals_as_positionals_actions,
3129
parent_parser,
3230
supports_optionals_as_positionals,
3331
)
34-
from ._completions import ShtabAction
3532
from ._deprecated import HelpFormatterDeprecations
3633
from ._link_arguments import ActionLink
3734
from ._namespace import Namespace, NSKeyError
@@ -87,7 +84,7 @@ def get_subparsers(parser, prefix=""):
8784
group_titles[parser_key] = parser.description
8885
prefix = "" if parser_key is None else parser_key + "."
8986
for group in parser._action_groups:
90-
actions = filter_default_actions(group._group_actions)
87+
actions = filter_non_parsing_actions(group._group_actions)
9188
actions = [
9289
a for a in actions if not isinstance(a, (_ActionConfigLoad, ActionConfigFile, _ActionSubCommands))
9390
]
@@ -255,7 +252,7 @@ def _format_action_invocation(self, action: Action) -> str:
255252
if isinstance(action, _SubParsersAction._ChoicesPseudoAction):
256253
return super()._format_action_invocation(action)
257254
extr = ""
258-
if not isinstance(action, (_ActionHelpClassPath, _ActionPrintConfig, ShtabAction, _HelpAction, _VersionAction)):
255+
if not isinstance(action, non_parsing_actions):
259256
extr += "\n ENV: " + get_env_var(self, action)
260257
return "ARG: " + super()._format_action_invocation(action) + extr
261258

jsonargparse/_link_arguments.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
_ActionSubCommands,
1818
_find_parent_action,
1919
_find_parent_action_and_subcommand,
20-
filter_default_actions,
20+
filter_non_parsing_actions,
2121
)
2222
from ._namespace import Namespace, split_key, split_key_leaf
2323
from ._parameter_resolvers import get_signature_parameters
@@ -36,7 +36,7 @@ def find_parent_or_child_actions(
3636
if action is not None:
3737
found = [action]
3838
else:
39-
actions = filter_default_actions(parser._actions)
39+
actions = filter_non_parsing_actions(parser._actions)
4040
if exclude is not None:
4141
actions = [a for a in actions if not isinstance(a, exclude)]
4242
prefix = key + "."

0 commit comments

Comments
 (0)