aboutsummaryrefslogtreecommitdiff
path: root/absl/flags
diff options
context:
space:
mode:
authorAbseil Team <absl-team@google.com>2020-04-07 10:28:43 -0700
committerCopybara-Service <copybara-worker@google.com>2020-04-07 10:29:06 -0700
commita97bd99f120275f732b547297dee0f1bd694afe7 (patch)
tree8e964da17729724664f8831944d1cff5b04e366b /absl/flags
parent2c2a0c3e7fb29fc8bebff2a1753c6c4961f65d0e (diff)
downloadabsl-py-a97bd99f120275f732b547297dee0f1bd694afe7.tar.gz
Add support for multi-flags to flag_dict_to_args helper.
Multi-flags are identified by an optional second argument consisting of a set of multi-flag names. PiperOrigin-RevId: 305287708 Change-Id: I26f1f1f40771d7e3a2d651812e6b3bf6fe3c5c17
Diffstat (limited to 'absl/flags')
-rw-r--r--absl/flags/_helpers.py14
-rw-r--r--absl/flags/tests/flags_test.py11
2 files changed, 22 insertions, 3 deletions
diff --git a/absl/flags/_helpers.py b/absl/flags/_helpers.py
index 817daa9..68b8cfc 100644
--- a/absl/flags/_helpers.py
+++ b/absl/flags/_helpers.py
@@ -318,7 +318,7 @@ def text_wrap(text, length=None, indent='', firstline_indent=None):
return '\n'.join(result)
-def flag_dict_to_args(flag_map):
+def flag_dict_to_args(flag_map, multi_flags=None):
"""Convert a dict of values into process call parameters.
This method is used to convert a dictionary into a sequence of parameters
@@ -331,8 +331,12 @@ def flag_dict_to_args(flag_map):
* If value is True, then only the name is emitted.
* If value is False, then only the name prepended with 'no' is emitted.
* If value is a string then --name=value is emitted.
- * If value is a collection, this will emit --name=value1,value2,value3.
+ * If value is a collection, this will emit --name=value1,value2,value3,
+ unless the flag name is in multi_flags, in which case this will emit
+ --name=value1 --name=value2 --name=value3.
* Everything else is converted to string an passed as such.
+ multi_flags: set, names (strings) of flags that should be treated as
+ multi-flags.
Yields:
sequence of string suitable for a subprocess execution.
"""
@@ -350,7 +354,11 @@ def flag_dict_to_args(flag_map):
else:
# Now we attempt to deal with collections.
try:
- yield '--%s=%s' % (key, ','.join(str(item) for item in value))
+ if multi_flags and key in multi_flags:
+ for item in value:
+ yield '--%s=%s' % (key, str(item))
+ else:
+ yield '--%s=%s' % (key, ','.join(str(item) for item in value))
except TypeError:
# Default case.
yield '--%s=%s' % (key, value)
diff --git a/absl/flags/tests/flags_test.py b/absl/flags/tests/flags_test.py
index 7bb7dca..0a54cd3 100644
--- a/absl/flags/tests/flags_test.py
+++ b/absl/flags/tests/flags_test.py
@@ -67,6 +67,17 @@ class FlagDictToArgsTest(absltest.TestCase):
'--loadthatstuff=42,hello,goodbye'),
flags.flag_dict_to_args(arg_dict))
+ def test_flatten_google_flag_map_with_multi_flag(self):
+ arg_dict = {
+ 'some_list': ['value1', 'value2'],
+ 'some_multi_string': ['value3', 'value4'],
+ }
+ self.assertSameElements(
+ (
+ '--some_list=value1,value2', '--some_multi_string=value3',
+ '--some_multi_string=value4'),
+ flags.flag_dict_to_args(arg_dict, multi_flags={'some_multi_string'}))
+
class Fruit(enum.Enum):
apple = 1