aboutsummaryrefslogtreecommitdiff
path: root/absl/testing/flagsaver.py
diff options
context:
space:
mode:
authorAbseil Team <absl-team@google.com>2020-12-14 13:02:02 -0800
committerCopybara-Service <copybara-worker@google.com>2020-12-14 13:02:30 -0800
commit94670de3dcf271f95d000cd8cdad754014a4cb5d (patch)
tree05d8ab4ffa1a70fdd88ce16a60f0ffb15fb0a5f4 /absl/testing/flagsaver.py
parentd61b0b6bda1902f645e5bbbc3f138c142767befa (diff)
downloadabsl-py-94670de3dcf271f95d000cd8cdad754014a4cb5d.tar.gz
Support using flagholder in flagsaver.
`(HOLDER, value)` pairs can now be specified in positional arguments. It is equivalent to specifying `**{HOLDER.name: value}` We can mix and match holder and non-holder overrides. So usages like `flagsaver((HOLDER1, value1), (HOLDER2, value2), flag_name=value)` are legal as well. PiperOrigin-RevId: 347450631 Change-Id: I45bdf7bd56ad1d65d62ff34536ef09e47fce7ae8
Diffstat (limited to 'absl/testing/flagsaver.py')
-rw-r--r--absl/testing/flagsaver.py23
1 files changed, 19 insertions, 4 deletions
diff --git a/absl/testing/flagsaver.py b/absl/testing/flagsaver.py
index c33d56a..7fe95fe 100644
--- a/absl/testing/flagsaver.py
+++ b/absl/testing/flagsaver.py
@@ -27,6 +27,11 @@ is temporarily set to 'foo'.
def some_func():
do_stuff()
+ # Use a decorator which can optionally override flags with flagholders.
+ @flagsaver.flagsaver((module.FOO_FLAG, 'foo'), (other_mod.BAR_FLAG, 23))
+ def some_func():
+ do_stuff()
+
# Use a decorator which does not override flags itself.
@flagsaver.flagsaver
def some_func():
@@ -70,7 +75,8 @@ def flagsaver(*args, **kwargs):
"""The main flagsaver interface. See module doc for usage."""
if not args:
return _FlagOverrider(**kwargs)
- elif len(args) == 1:
+ # args can be [func] if used as `@flagsaver` instead of `@flagsaver(...)`
+ if len(args) == 1 and callable(args[0]):
if kwargs:
raise ValueError(
"It's invalid to specify both positional and keyword parameters.")
@@ -78,9 +84,18 @@ def flagsaver(*args, **kwargs):
if inspect.isclass(func):
raise TypeError('@flagsaver.flagsaver cannot be applied to a class.')
return _wrap(func, {})
- else:
- raise ValueError(
- "It's invalid to specify more than one positional parameters.")
+ # args can be a list of (FlagHolder, value) pairs.
+ # In which case they augment any specified kwargs.
+ for arg in args:
+ if not isinstance(arg, tuple) or len(arg) != 2:
+ raise ValueError('Expected (FlagHolder, value) pair, found %r' % (arg,))
+ holder, value = arg
+ if not isinstance(holder, flags.FlagHolder):
+ raise ValueError('Expected (FlagHolder, value) pair, found %r' % (arg,))
+ if holder.name in kwargs:
+ raise ValueError('Cannot set --%s multiple times' % holder.name)
+ kwargs[holder.name] = value
+ return _FlagOverrider(**kwargs)
def save_flag_values(flag_values=FLAGS):