diff options
author | Abseil Team <absl-team@google.com> | 2020-04-07 10:28:43 -0700 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2020-04-07 10:29:06 -0700 |
commit | a97bd99f120275f732b547297dee0f1bd694afe7 (patch) | |
tree | 8e964da17729724664f8831944d1cff5b04e366b /absl/flags | |
parent | 2c2a0c3e7fb29fc8bebff2a1753c6c4961f65d0e (diff) | |
download | absl-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.py | 14 | ||||
-rw-r--r-- | absl/flags/tests/flags_test.py | 11 |
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 |