aboutsummaryrefslogtreecommitdiff
path: root/absl
diff options
context:
space:
mode:
authorYilei Yang <yileiyang@google.com>2021-07-19 11:26:09 -0700
committerCopybara-Service <copybara-worker@google.com>2021-07-19 11:26:29 -0700
commit9a555e920f53af7e00d68f4e0706303329699cea (patch)
tree92bda1674509bcb1da5699121c42bfb1798f8003 /absl
parent4c066f82472f5b4020eabbfd601b4c9aa58763f0 (diff)
downloadabsl-py-9a555e920f53af7e00d68f4e0706303329699cea.tar.gz
Fix #171: add an ignored `default=` argument to our custom actions.
This is a required argument for custom argparse.Action classes, and is used when the `ArgumentParse` is created with a `argument_default=`. PiperOrigin-RevId: 385601086 Change-Id: I01ef4870aa4f0e92f7e8f9be0125c9a0dba16c6f
Diffstat (limited to 'absl')
-rw-r--r--absl/CHANGELOG.md5
-rw-r--r--absl/flags/argparse_flags.py27
-rw-r--r--absl/flags/tests/argparse_flags_test.py10
3 files changed, 37 insertions, 5 deletions
diff --git a/absl/CHANGELOG.md b/absl/CHANGELOG.md
index aff590d..253628f 100644
--- a/absl/CHANGELOG.md
+++ b/absl/CHANGELOG.md
@@ -6,7 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com).
## Unreleased
-Nothing notable unreleased.
+### Fixed
+
+* #171: Creating `argparse_flags.ArgumentParser` with `argument_default=` no
+ longer raises an exception when other `absl.flags` flags are defined.
## 0.13.0 (2021-06-14)
diff --git a/absl/flags/argparse_flags.py b/absl/flags/argparse_flags.py
index ea4cdfa..4f78f50 100644
--- a/absl/flags/argparse_flags.py
+++ b/absl/flags/argparse_flags.py
@@ -148,7 +148,8 @@ class ArgumentParser(argparse.ArgumentParser):
default=argparse.SUPPRESS, help='show full help message and exit')
if self._inherited_absl_flags:
- self.add_argument('--undefok', help=argparse.SUPPRESS)
+ self.add_argument(
+ '--undefok', default=argparse.SUPPRESS, help=argparse.SUPPRESS)
self._define_absl_flags(self._inherited_absl_flags)
def parse_known_args(self, args=None, namespace=None):
@@ -237,7 +238,14 @@ class ArgumentParser(argparse.ArgumentParser):
class _FlagAction(argparse.Action):
"""Action class for Abseil non-boolean flags."""
- def __init__(self, option_strings, dest, help, metavar, flag_instance): # pylint: disable=redefined-builtin
+ def __init__(
+ self,
+ option_strings,
+ dest,
+ help, # pylint: disable=redefined-builtin
+ metavar,
+ flag_instance,
+ default=argparse.SUPPRESS):
"""Initializes _FlagAction.
Args:
@@ -246,6 +254,8 @@ class _FlagAction(argparse.Action):
help: See argparse.Action.
metavar: See argparse.Action.
flag_instance: absl.flags.Flag, the absl flag instance.
+ default: Ignored. The flag always uses dest=argparse.SUPPRESS so it
+ doesn't affect the parsing result.
"""
del dest
self._flag_instance = flag_instance
@@ -264,7 +274,14 @@ class _FlagAction(argparse.Action):
class _BooleanFlagAction(argparse.Action):
"""Action class for Abseil boolean flags."""
- def __init__(self, option_strings, dest, help, metavar, flag_instance): # pylint: disable=redefined-builtin
+ def __init__(
+ self,
+ option_strings,
+ dest,
+ help, # pylint: disable=redefined-builtin
+ metavar,
+ flag_instance,
+ default=argparse.SUPPRESS):
"""Initializes _BooleanFlagAction.
Args:
@@ -273,8 +290,10 @@ class _BooleanFlagAction(argparse.Action):
help: See argparse.Action.
metavar: See argparse.Action.
flag_instance: absl.flags.Flag, the absl flag instance.
+ default: Ignored. The flag always uses dest=argparse.SUPPRESS so it
+ doesn't affect the parsing result.
"""
- del dest
+ del dest, default
self._flag_instance = flag_instance
flag_names = [self._flag_instance.name]
if self._flag_instance.short_name:
diff --git a/absl/flags/tests/argparse_flags_test.py b/absl/flags/tests/argparse_flags_test.py
index ddd62a9..a2bcbe5 100644
--- a/absl/flags/tests/argparse_flags_test.py
+++ b/absl/flags/tests/argparse_flags_test.py
@@ -36,6 +36,7 @@ import six
class ArgparseFlagsTest(parameterized.TestCase):
def setUp(self):
+ super().setUp()
self._absl_flags = flags.FlagValues()
flags.DEFINE_bool(
'absl_bool', None, 'help for --absl_bool.',
@@ -393,6 +394,15 @@ class ArgparseFlagsTest(parameterized.TestCase):
with self.assertRaises(SystemExit):
parser.parse_args(cmd_args)
+ def test_argument_default(self):
+ # Regression test for https://github.com/abseil/abseil-py/issues/171.
+ parser = argparse_flags.ArgumentParser(
+ inherited_absl_flags=self._absl_flags, argument_default=23)
+ parser.add_argument(
+ '--magic_number', type=int, help='The magic number to use.')
+ args = parser.parse_args([])
+ self.assertEqual(args.magic_number, 23)
+
class ArgparseWithAppRunTest(parameterized.TestCase):