1687 lines
52 KiB
Python
1687 lines
52 KiB
Python
# Copyright 2017 The Abseil Authors.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
"""This modules contains flags DEFINE functions.
|
|
|
|
Do NOT import this module directly. Import the flags package and use the
|
|
aliases defined at the package level instead.
|
|
"""
|
|
|
|
import enum
|
|
import sys
|
|
import types
|
|
import typing
|
|
from typing import Text, List, Any, TypeVar, Optional, Union, Type, Iterable, overload
|
|
|
|
from absl.flags import _argument_parser
|
|
from absl.flags import _exceptions
|
|
from absl.flags import _flag
|
|
from absl.flags import _flagvalues
|
|
from absl.flags import _helpers
|
|
from absl.flags import _validators
|
|
|
|
_helpers.disclaim_module_ids.add(id(sys.modules[__name__]))
|
|
|
|
_T = TypeVar('_T')
|
|
_ET = TypeVar('_ET', bound=enum.Enum)
|
|
|
|
|
|
def _register_bounds_validator_if_needed(parser, name, flag_values):
|
|
"""Enforces lower and upper bounds for numeric flags.
|
|
|
|
Args:
|
|
parser: NumericParser (either FloatParser or IntegerParser), provides lower
|
|
and upper bounds, and help text to display.
|
|
name: str, name of the flag
|
|
flag_values: FlagValues.
|
|
"""
|
|
if parser.lower_bound is not None or parser.upper_bound is not None:
|
|
|
|
def checker(value):
|
|
if value is not None and parser.is_outside_bounds(value):
|
|
message = '%s is not %s' % (value, parser.syntactic_help)
|
|
raise _exceptions.ValidationError(message)
|
|
return True
|
|
|
|
_validators.register_validator(name, checker, flag_values=flag_values)
|
|
|
|
|
|
@overload
|
|
def DEFINE( # pylint: disable=invalid-name
|
|
parser: _argument_parser.ArgumentParser[_T],
|
|
name: Text,
|
|
default: Any,
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
serializer: Optional[_argument_parser.ArgumentSerializer[_T]] = ...,
|
|
module_name: Optional[Text] = ...,
|
|
required: 'typing.Literal[True]' = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[_T]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE( # pylint: disable=invalid-name
|
|
parser: _argument_parser.ArgumentParser[_T],
|
|
name: Text,
|
|
default: Optional[Any],
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
serializer: Optional[_argument_parser.ArgumentSerializer[_T]] = ...,
|
|
module_name: Optional[Text] = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Optional[_T]]:
|
|
...
|
|
|
|
|
|
def DEFINE( # pylint: disable=invalid-name
|
|
parser,
|
|
name,
|
|
default,
|
|
help, # pylint: disable=redefined-builtin
|
|
flag_values=_flagvalues.FLAGS,
|
|
serializer=None,
|
|
module_name=None,
|
|
required=False,
|
|
**args):
|
|
"""Registers a generic Flag object.
|
|
|
|
NOTE: in the docstrings of all DEFINE* functions, "registers" is short
|
|
for "creates a new flag and registers it".
|
|
|
|
Auxiliary function: clients should use the specialized ``DEFINE_<type>``
|
|
function instead.
|
|
|
|
Args:
|
|
parser: :class:`ArgumentParser`, used to parse the flag arguments.
|
|
name: str, the flag name.
|
|
default: The default value of the flag.
|
|
help: str, the help message.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance with which the
|
|
flag will be registered. This should almost never need to be overridden.
|
|
serializer: :class:`ArgumentSerializer`, the flag serializer instance.
|
|
module_name: str, the name of the Python module declaring this flag. If not
|
|
provided, it will be computed using the stack trace of this call.
|
|
required: bool, is this a required flag. This must be used as a keyword
|
|
argument.
|
|
**args: dict, the extra keyword args that are passed to ``Flag.__init__``.
|
|
|
|
Returns:
|
|
a handle to defined flag.
|
|
"""
|
|
return DEFINE_flag(
|
|
_flag.Flag(parser, serializer, name, default, help, **args),
|
|
flag_values,
|
|
module_name,
|
|
required=True if required else False,
|
|
)
|
|
|
|
|
|
@overload
|
|
def DEFINE_flag( # pylint: disable=invalid-name
|
|
flag: _flag.Flag[_T],
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
required: 'typing.Literal[True]' = ...,
|
|
) -> _flagvalues.FlagHolder[_T]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_flag( # pylint: disable=invalid-name
|
|
flag: _flag.Flag[_T],
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
required: bool = ...,
|
|
) -> _flagvalues.FlagHolder[Optional[_T]]:
|
|
...
|
|
|
|
|
|
def DEFINE_flag( # pylint: disable=invalid-name
|
|
flag,
|
|
flag_values=_flagvalues.FLAGS,
|
|
module_name=None,
|
|
required=False):
|
|
"""Registers a :class:`Flag` object with a :class:`FlagValues` object.
|
|
|
|
By default, the global :const:`FLAGS` ``FlagValue`` object is used.
|
|
|
|
Typical users will use one of the more specialized DEFINE_xxx
|
|
functions, such as :func:`DEFINE_string` or :func:`DEFINE_integer`. But
|
|
developers who need to create :class:`Flag` objects themselves should use
|
|
this function to register their flags.
|
|
|
|
Args:
|
|
flag: :class:`Flag`, a flag that is key to the module.
|
|
flag_values: :class:`FlagValues`, the ``FlagValues`` instance with which the
|
|
flag will be registered. This should almost never need to be overridden.
|
|
module_name: str, the name of the Python module declaring this flag. If not
|
|
provided, it will be computed using the stack trace of this call.
|
|
required: bool, is this a required flag. This must be used as a keyword
|
|
argument.
|
|
|
|
Returns:
|
|
a handle to defined flag.
|
|
"""
|
|
if required and flag.default is not None:
|
|
raise ValueError('Required flag --%s cannot have a non-None default' %
|
|
flag.name)
|
|
# Copying the reference to flag_values prevents pychecker warnings.
|
|
fv = flag_values
|
|
fv[flag.name] = flag
|
|
# Tell flag_values who's defining the flag.
|
|
if module_name:
|
|
module = sys.modules.get(module_name)
|
|
else:
|
|
module, module_name = _helpers.get_calling_module_object_and_name()
|
|
flag_values.register_flag_by_module(module_name, flag)
|
|
flag_values.register_flag_by_module_id(id(module), flag)
|
|
if required:
|
|
_validators.mark_flag_as_required(flag.name, fv)
|
|
ensure_non_none_value = (flag.default is not None) or required
|
|
return _flagvalues.FlagHolder(
|
|
fv, flag, ensure_non_none_value=ensure_non_none_value)
|
|
|
|
|
|
def set_default(flag_holder: _flagvalues.FlagHolder[_T], value: _T) -> None:
|
|
"""Changes the default value of the provided flag object.
|
|
|
|
The flag's current value is also updated if the flag is currently using
|
|
the default value, i.e. not specified in the command line, and not set
|
|
by FLAGS.name = value.
|
|
|
|
Args:
|
|
flag_holder: FlagHolder, the flag to modify.
|
|
value: The new default value.
|
|
|
|
Raises:
|
|
IllegalFlagValueError: Raised when value is not valid.
|
|
"""
|
|
flag_holder._flagvalues.set_default(flag_holder.name, value) # pylint: disable=protected-access
|
|
|
|
|
|
def override_value(flag_holder: _flagvalues.FlagHolder[_T], value: _T) -> None:
|
|
"""Overrides the value of the provided flag.
|
|
|
|
This value takes precedent over the default value and, when called after flag
|
|
parsing, any value provided at the command line.
|
|
|
|
Args:
|
|
flag_holder: FlagHolder, the flag to modify.
|
|
value: The new value.
|
|
|
|
Raises:
|
|
IllegalFlagValueError: The value did not pass the flag parser or validators.
|
|
"""
|
|
fv = flag_holder._flagvalues # pylint: disable=protected-access
|
|
# Ensure the new value satisfies the flag's parser while avoiding side
|
|
# effects of calling parse().
|
|
parsed = fv[flag_holder.name]._parse(value) # pylint: disable=protected-access
|
|
if parsed != value:
|
|
raise _exceptions.IllegalFlagValueError(
|
|
'flag %s: parsed value %r not equal to original %r'
|
|
% (flag_holder.name, parsed, value)
|
|
)
|
|
setattr(fv, flag_holder.name, value)
|
|
|
|
|
|
def _internal_declare_key_flags(
|
|
flag_names: List[str],
|
|
flag_values: _flagvalues.FlagValues = _flagvalues.FLAGS,
|
|
key_flag_values: Optional[_flagvalues.FlagValues] = None,
|
|
) -> None:
|
|
"""Declares a flag as key for the calling module.
|
|
|
|
Internal function. User code should call declare_key_flag or
|
|
adopt_module_key_flags instead.
|
|
|
|
Args:
|
|
flag_names: [str], a list of names of already-registered Flag objects.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance with which the
|
|
flags listed in flag_names have registered (the value of the flag_values
|
|
argument from the ``DEFINE_*`` calls that defined those flags). This
|
|
should almost never need to be overridden.
|
|
key_flag_values: :class:`FlagValues`, the FlagValues instance that (among
|
|
possibly many other things) keeps track of the key flags for each module.
|
|
Default ``None`` means "same as flag_values". This should almost never
|
|
need to be overridden.
|
|
|
|
Raises:
|
|
UnrecognizedFlagError: Raised when the flag is not defined.
|
|
"""
|
|
key_flag_values = key_flag_values or flag_values
|
|
|
|
module = _helpers.get_calling_module()
|
|
|
|
for flag_name in flag_names:
|
|
key_flag_values.register_key_flag_for_module(module, flag_values[flag_name])
|
|
|
|
|
|
def declare_key_flag(
|
|
flag_name: Union[Text, _flagvalues.FlagHolder],
|
|
flag_values: _flagvalues.FlagValues = _flagvalues.FLAGS,
|
|
) -> None:
|
|
"""Declares one flag as key to the current module.
|
|
|
|
Key flags are flags that are deemed really important for a module.
|
|
They are important when listing help messages; e.g., if the
|
|
--helpshort command-line flag is used, then only the key flags of the
|
|
main module are listed (instead of all flags, as in the case of
|
|
--helpfull).
|
|
|
|
Sample usage::
|
|
|
|
flags.declare_key_flag('flag_1')
|
|
|
|
Args:
|
|
flag_name: str | :class:`FlagHolder`, the name or holder of an already
|
|
declared flag. (Redeclaring flags as key, including flags implicitly key
|
|
because they were declared in this module, is a no-op.)
|
|
Positional-only parameter.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance in which the
|
|
flag will be declared as a key flag. This should almost never need to be
|
|
overridden.
|
|
|
|
Raises:
|
|
ValueError: Raised if flag_name not defined as a Python flag.
|
|
"""
|
|
flag_name, flag_values = _flagvalues.resolve_flag_ref(flag_name, flag_values)
|
|
if flag_name in _helpers.SPECIAL_FLAGS:
|
|
# Take care of the special flags, e.g., --flagfile, --undefok.
|
|
# These flags are defined in SPECIAL_FLAGS, and are treated
|
|
# specially during flag parsing, taking precedence over the
|
|
# user-defined flags.
|
|
_internal_declare_key_flags([flag_name],
|
|
flag_values=_helpers.SPECIAL_FLAGS,
|
|
key_flag_values=flag_values)
|
|
return
|
|
try:
|
|
_internal_declare_key_flags([flag_name], flag_values=flag_values)
|
|
except KeyError:
|
|
raise ValueError('Flag --%s is undefined. To set a flag as a key flag '
|
|
'first define it in Python.' % flag_name)
|
|
|
|
|
|
def adopt_module_key_flags(
|
|
module: Any, flag_values: _flagvalues.FlagValues = _flagvalues.FLAGS
|
|
) -> None:
|
|
"""Declares that all flags key to a module are key to the current module.
|
|
|
|
Args:
|
|
module: module, the module object from which all key flags will be declared
|
|
as key flags to the current module.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance in which the
|
|
flags will be declared as key flags. This should almost never need to be
|
|
overridden.
|
|
|
|
Raises:
|
|
Error: Raised when given an argument that is a module name (a string),
|
|
instead of a module object.
|
|
"""
|
|
if not isinstance(module, types.ModuleType):
|
|
raise _exceptions.Error('Expected a module object, not %r.' % (module,))
|
|
_internal_declare_key_flags(
|
|
[f.name for f in flag_values.get_key_flags_for_module(module.__name__)],
|
|
flag_values=flag_values)
|
|
# If module is this flag module, take _helpers.SPECIAL_FLAGS into account.
|
|
if module == _helpers.FLAGS_MODULE:
|
|
_internal_declare_key_flags(
|
|
# As we associate flags with get_calling_module_object_and_name(), the
|
|
# special flags defined in this module are incorrectly registered with
|
|
# a different module. So, we can't use get_key_flags_for_module.
|
|
# Instead, we take all flags from _helpers.SPECIAL_FLAGS (a private
|
|
# FlagValues, where no other module should register flags).
|
|
[_helpers.SPECIAL_FLAGS[name].name for name in _helpers.SPECIAL_FLAGS],
|
|
flag_values=_helpers.SPECIAL_FLAGS,
|
|
key_flag_values=flag_values)
|
|
|
|
|
|
def disclaim_key_flags() -> None:
|
|
"""Declares that the current module will not define any more key flags.
|
|
|
|
Normally, the module that calls the DEFINE_xxx functions claims the
|
|
flag to be its key flag. This is undesirable for modules that
|
|
define additional DEFINE_yyy functions with its own flag parsers and
|
|
serializers, since that module will accidentally claim flags defined
|
|
by DEFINE_yyy as its key flags. After calling this function, the
|
|
module disclaims flag definitions thereafter, so the key flags will
|
|
be correctly attributed to the caller of DEFINE_yyy.
|
|
|
|
After calling this function, the module will not be able to define
|
|
any more flags. This function will affect all FlagValues objects.
|
|
"""
|
|
globals_for_caller = sys._getframe(1).f_globals # pylint: disable=protected-access
|
|
module, _ = _helpers.get_module_object_and_name(globals_for_caller)
|
|
_helpers.disclaim_module_ids.add(id(module))
|
|
|
|
|
|
@overload
|
|
def DEFINE_string( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Optional[Text],
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
*,
|
|
required: 'typing.Literal[True]',
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Text]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_string( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: None,
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Optional[Text]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_string( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Text,
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Text]:
|
|
...
|
|
|
|
|
|
def DEFINE_string( # pylint: disable=invalid-name,redefined-builtin
|
|
name,
|
|
default,
|
|
help,
|
|
flag_values=_flagvalues.FLAGS,
|
|
required=False,
|
|
**args):
|
|
"""Registers a flag whose value can be any string."""
|
|
parser = _argument_parser.ArgumentParser[str]()
|
|
serializer = _argument_parser.ArgumentSerializer[str]()
|
|
return DEFINE(
|
|
parser,
|
|
name,
|
|
default,
|
|
help,
|
|
flag_values,
|
|
serializer,
|
|
required=True if required else False,
|
|
**args,
|
|
)
|
|
|
|
|
|
@overload
|
|
def DEFINE_boolean( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[None, Text, bool, int],
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
*,
|
|
required: 'typing.Literal[True]',
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[bool]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_boolean( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: None,
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Optional[bool]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_boolean( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[Text, bool, int],
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[bool]:
|
|
...
|
|
|
|
|
|
def DEFINE_boolean( # pylint: disable=invalid-name,redefined-builtin
|
|
name,
|
|
default,
|
|
help,
|
|
flag_values=_flagvalues.FLAGS,
|
|
module_name=None,
|
|
required=False,
|
|
**args):
|
|
"""Registers a boolean flag.
|
|
|
|
Such a boolean flag does not take an argument. If a user wants to
|
|
specify a false value explicitly, the long option beginning with 'no'
|
|
must be used: i.e. --noflag
|
|
|
|
This flag will have a value of None, True or False. None is possible
|
|
if default=None and the user does not specify the flag on the command
|
|
line.
|
|
|
|
Args:
|
|
name: str, the flag name.
|
|
default: bool|str|None, the default value of the flag.
|
|
help: str, the help message.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance with which the
|
|
flag will be registered. This should almost never need to be overridden.
|
|
module_name: str, the name of the Python module declaring this flag. If not
|
|
provided, it will be computed using the stack trace of this call.
|
|
required: bool, is this a required flag. This must be used as a keyword
|
|
argument.
|
|
**args: dict, the extra keyword args that are passed to ``Flag.__init__``.
|
|
|
|
Returns:
|
|
a handle to defined flag.
|
|
"""
|
|
return DEFINE_flag(
|
|
_flag.BooleanFlag(name, default, help, **args),
|
|
flag_values,
|
|
module_name,
|
|
required=True if required else False,
|
|
)
|
|
|
|
|
|
@overload
|
|
def DEFINE_float( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[None, float, Text],
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
lower_bound: Optional[float] = ...,
|
|
upper_bound: Optional[float] = ...,
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
*,
|
|
required: 'typing.Literal[True]',
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[float]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_float( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: None,
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
lower_bound: Optional[float] = ...,
|
|
upper_bound: Optional[float] = ...,
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Optional[float]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_float( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[float, Text],
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
lower_bound: Optional[float] = ...,
|
|
upper_bound: Optional[float] = ...,
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[float]:
|
|
...
|
|
|
|
|
|
def DEFINE_float( # pylint: disable=invalid-name,redefined-builtin
|
|
name,
|
|
default,
|
|
help,
|
|
lower_bound=None,
|
|
upper_bound=None,
|
|
flag_values=_flagvalues.FLAGS,
|
|
required=False,
|
|
**args):
|
|
"""Registers a flag whose value must be a float.
|
|
|
|
If ``lower_bound`` or ``upper_bound`` are set, then this flag must be
|
|
within the given range.
|
|
|
|
Args:
|
|
name: str, the flag name.
|
|
default: float|str|None, the default value of the flag.
|
|
help: str, the help message.
|
|
lower_bound: float, min value of the flag.
|
|
upper_bound: float, max value of the flag.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance with which the
|
|
flag will be registered. This should almost never need to be overridden.
|
|
required: bool, is this a required flag. This must be used as a keyword
|
|
argument.
|
|
**args: dict, the extra keyword args that are passed to :func:`DEFINE`.
|
|
|
|
Returns:
|
|
a handle to defined flag.
|
|
"""
|
|
parser = _argument_parser.FloatParser(lower_bound, upper_bound)
|
|
serializer = _argument_parser.ArgumentSerializer()
|
|
result = DEFINE(
|
|
parser,
|
|
name,
|
|
default,
|
|
help,
|
|
flag_values,
|
|
serializer,
|
|
required=True if required else False,
|
|
**args,
|
|
)
|
|
_register_bounds_validator_if_needed(parser, name, flag_values=flag_values)
|
|
return result
|
|
|
|
|
|
@overload
|
|
def DEFINE_integer( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[None, int, Text],
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
lower_bound: Optional[int] = ...,
|
|
upper_bound: Optional[int] = ...,
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
*,
|
|
required: 'typing.Literal[True]',
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[int]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_integer( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: None,
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
lower_bound: Optional[int] = ...,
|
|
upper_bound: Optional[int] = ...,
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Optional[int]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_integer( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[int, Text],
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
lower_bound: Optional[int] = ...,
|
|
upper_bound: Optional[int] = ...,
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[int]:
|
|
...
|
|
|
|
|
|
def DEFINE_integer( # pylint: disable=invalid-name,redefined-builtin
|
|
name,
|
|
default,
|
|
help,
|
|
lower_bound=None,
|
|
upper_bound=None,
|
|
flag_values=_flagvalues.FLAGS,
|
|
required=False,
|
|
**args):
|
|
"""Registers a flag whose value must be an integer.
|
|
|
|
If ``lower_bound``, or ``upper_bound`` are set, then this flag must be
|
|
within the given range.
|
|
|
|
Args:
|
|
name: str, the flag name.
|
|
default: int|str|None, the default value of the flag.
|
|
help: str, the help message.
|
|
lower_bound: int, min value of the flag.
|
|
upper_bound: int, max value of the flag.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance with which the
|
|
flag will be registered. This should almost never need to be overridden.
|
|
required: bool, is this a required flag. This must be used as a keyword
|
|
argument.
|
|
**args: dict, the extra keyword args that are passed to :func:`DEFINE`.
|
|
|
|
Returns:
|
|
a handle to defined flag.
|
|
"""
|
|
parser = _argument_parser.IntegerParser(lower_bound, upper_bound)
|
|
serializer = _argument_parser.ArgumentSerializer()
|
|
result = DEFINE(
|
|
parser,
|
|
name,
|
|
default,
|
|
help,
|
|
flag_values,
|
|
serializer,
|
|
required=True if required else False,
|
|
**args,
|
|
)
|
|
_register_bounds_validator_if_needed(parser, name, flag_values=flag_values)
|
|
return result
|
|
|
|
|
|
@overload
|
|
def DEFINE_enum( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Optional[Text],
|
|
enum_values: Iterable[Text],
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
*,
|
|
required: 'typing.Literal[True]',
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Text]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_enum( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: None,
|
|
enum_values: Iterable[Text],
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Optional[Text]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_enum( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Text,
|
|
enum_values: Iterable[Text],
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Text]:
|
|
...
|
|
|
|
|
|
def DEFINE_enum( # pylint: disable=invalid-name,redefined-builtin
|
|
name,
|
|
default,
|
|
enum_values,
|
|
help,
|
|
flag_values=_flagvalues.FLAGS,
|
|
module_name=None,
|
|
required=False,
|
|
**args):
|
|
"""Registers a flag whose value can be any string from enum_values.
|
|
|
|
Instead of a string enum, prefer `DEFINE_enum_class`, which allows
|
|
defining enums from an `enum.Enum` class.
|
|
|
|
Args:
|
|
name: str, the flag name.
|
|
default: str|None, the default value of the flag.
|
|
enum_values: [str], a non-empty list of strings with the possible values for
|
|
the flag.
|
|
help: str, the help message.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance with which the
|
|
flag will be registered. This should almost never need to be overridden.
|
|
module_name: str, the name of the Python module declaring this flag. If not
|
|
provided, it will be computed using the stack trace of this call.
|
|
required: bool, is this a required flag. This must be used as a keyword
|
|
argument.
|
|
**args: dict, the extra keyword args that are passed to ``Flag.__init__``.
|
|
|
|
Returns:
|
|
a handle to defined flag.
|
|
"""
|
|
result = DEFINE_flag(
|
|
_flag.EnumFlag(name, default, help, enum_values, **args),
|
|
flag_values,
|
|
module_name,
|
|
required=True if required else False,
|
|
)
|
|
return result
|
|
|
|
|
|
@overload
|
|
def DEFINE_enum_class( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[None, _ET, Text],
|
|
enum_class: Type[_ET],
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
case_sensitive: bool = ...,
|
|
*,
|
|
required: 'typing.Literal[True]',
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[_ET]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_enum_class( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: None,
|
|
enum_class: Type[_ET],
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
case_sensitive: bool = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Optional[_ET]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_enum_class( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[_ET, Text],
|
|
enum_class: Type[_ET],
|
|
help: Optional[Text], # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
case_sensitive: bool = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[_ET]:
|
|
...
|
|
|
|
|
|
def DEFINE_enum_class( # pylint: disable=invalid-name,redefined-builtin
|
|
name,
|
|
default,
|
|
enum_class,
|
|
help,
|
|
flag_values=_flagvalues.FLAGS,
|
|
module_name=None,
|
|
case_sensitive=False,
|
|
required=False,
|
|
**args):
|
|
"""Registers a flag whose value can be the name of enum members.
|
|
|
|
Args:
|
|
name: str, the flag name.
|
|
default: Enum|str|None, the default value of the flag.
|
|
enum_class: class, the Enum class with all the possible values for the flag.
|
|
help: str, the help message.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance with which the
|
|
flag will be registered. This should almost never need to be overridden.
|
|
module_name: str, the name of the Python module declaring this flag. If not
|
|
provided, it will be computed using the stack trace of this call.
|
|
case_sensitive: bool, whether to map strings to members of the enum_class
|
|
without considering case.
|
|
required: bool, is this a required flag. This must be used as a keyword
|
|
argument.
|
|
**args: dict, the extra keyword args that are passed to ``Flag.__init__``.
|
|
|
|
Returns:
|
|
a handle to defined flag.
|
|
"""
|
|
# NOTE: pytype fails if this is a direct return.
|
|
result = DEFINE_flag(
|
|
_flag.EnumClassFlag(
|
|
name, default, help, enum_class, case_sensitive=case_sensitive, **args
|
|
),
|
|
flag_values,
|
|
module_name,
|
|
required=True if required else False,
|
|
)
|
|
return result
|
|
|
|
|
|
@overload
|
|
def DEFINE_list( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[None, Iterable[Text], Text],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
*,
|
|
required: 'typing.Literal[True]',
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[Text]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_list( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: None,
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Optional[List[Text]]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_list( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[Iterable[Text], Text],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[Text]]:
|
|
...
|
|
|
|
|
|
def DEFINE_list( # pylint: disable=invalid-name,redefined-builtin
|
|
name,
|
|
default,
|
|
help,
|
|
flag_values=_flagvalues.FLAGS,
|
|
required=False,
|
|
**args):
|
|
"""Registers a flag whose value is a comma-separated list of strings.
|
|
|
|
The flag value is parsed with a CSV parser.
|
|
|
|
Args:
|
|
name: str, the flag name.
|
|
default: list|str|None, the default value of the flag.
|
|
help: str, the help message.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance with which the
|
|
flag will be registered. This should almost never need to be overridden.
|
|
required: bool, is this a required flag. This must be used as a keyword
|
|
argument.
|
|
**args: Dictionary with extra keyword args that are passed to the
|
|
``Flag.__init__``.
|
|
|
|
Returns:
|
|
a handle to defined flag.
|
|
"""
|
|
parser = _argument_parser.ListParser()
|
|
serializer = _argument_parser.CsvListSerializer(',')
|
|
return DEFINE(
|
|
parser,
|
|
name,
|
|
default,
|
|
help,
|
|
flag_values,
|
|
serializer,
|
|
required=True if required else False,
|
|
**args,
|
|
)
|
|
|
|
|
|
@overload
|
|
def DEFINE_spaceseplist( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[None, Iterable[Text], Text],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
comma_compat: bool = ...,
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
*,
|
|
required: 'typing.Literal[True]',
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[Text]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_spaceseplist( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: None,
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
comma_compat: bool = ...,
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Optional[List[Text]]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_spaceseplist( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[Iterable[Text], Text],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
comma_compat: bool = ...,
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[Text]]:
|
|
...
|
|
|
|
|
|
def DEFINE_spaceseplist( # pylint: disable=invalid-name,redefined-builtin
|
|
name,
|
|
default,
|
|
help,
|
|
comma_compat=False,
|
|
flag_values=_flagvalues.FLAGS,
|
|
required=False,
|
|
**args):
|
|
"""Registers a flag whose value is a whitespace-separated list of strings.
|
|
|
|
Any whitespace can be used as a separator.
|
|
|
|
Args:
|
|
name: str, the flag name.
|
|
default: list|str|None, the default value of the flag.
|
|
help: str, the help message.
|
|
comma_compat: bool - Whether to support comma as an additional separator. If
|
|
false then only whitespace is supported. This is intended only for
|
|
backwards compatibility with flags that used to be comma-separated.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance with which the
|
|
flag will be registered. This should almost never need to be overridden.
|
|
required: bool, is this a required flag. This must be used as a keyword
|
|
argument.
|
|
**args: Dictionary with extra keyword args that are passed to the
|
|
``Flag.__init__``.
|
|
|
|
Returns:
|
|
a handle to defined flag.
|
|
"""
|
|
parser = _argument_parser.WhitespaceSeparatedListParser(
|
|
comma_compat=comma_compat)
|
|
serializer = _argument_parser.ListSerializer(' ')
|
|
return DEFINE(
|
|
parser,
|
|
name,
|
|
default,
|
|
help,
|
|
flag_values,
|
|
serializer,
|
|
required=True if required else False,
|
|
**args,
|
|
)
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi( # pylint: disable=invalid-name
|
|
parser: _argument_parser.ArgumentParser[_T],
|
|
serializer: _argument_parser.ArgumentSerializer[_T],
|
|
name: Text,
|
|
default: Iterable[_T],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
*,
|
|
required: 'typing.Literal[True]',
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[_T]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi( # pylint: disable=invalid-name
|
|
parser: _argument_parser.ArgumentParser[_T],
|
|
serializer: _argument_parser.ArgumentSerializer[_T],
|
|
name: Text,
|
|
default: Union[None, _T],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
*,
|
|
required: 'typing.Literal[True]',
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[_T]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi( # pylint: disable=invalid-name
|
|
parser: _argument_parser.ArgumentParser[_T],
|
|
serializer: _argument_parser.ArgumentSerializer[_T],
|
|
name: Text,
|
|
default: None,
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Optional[List[_T]]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi( # pylint: disable=invalid-name
|
|
parser: _argument_parser.ArgumentParser[_T],
|
|
serializer: _argument_parser.ArgumentSerializer[_T],
|
|
name: Text,
|
|
default: Iterable[_T],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[_T]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi( # pylint: disable=invalid-name
|
|
parser: _argument_parser.ArgumentParser[_T],
|
|
serializer: _argument_parser.ArgumentSerializer[_T],
|
|
name: Text,
|
|
default: _T,
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[_T]]:
|
|
...
|
|
|
|
|
|
def DEFINE_multi( # pylint: disable=invalid-name,redefined-builtin
|
|
parser,
|
|
serializer,
|
|
name,
|
|
default,
|
|
help,
|
|
flag_values=_flagvalues.FLAGS,
|
|
module_name=None,
|
|
required=False,
|
|
**args):
|
|
"""Registers a generic MultiFlag that parses its args with a given parser.
|
|
|
|
Auxiliary function. Normal users should NOT use it directly.
|
|
|
|
Developers who need to create their own 'Parser' classes for options
|
|
which can appear multiple times can call this module function to
|
|
register their flags.
|
|
|
|
Args:
|
|
parser: ArgumentParser, used to parse the flag arguments.
|
|
serializer: ArgumentSerializer, the flag serializer instance.
|
|
name: str, the flag name.
|
|
default: Union[Iterable[T], Text, None], the default value of the flag. If
|
|
the value is text, it will be parsed as if it was provided from the
|
|
command line. If the value is a non-string iterable, it will be iterated
|
|
over to create a shallow copy of the values. If it is None, it is left
|
|
as-is.
|
|
help: str, the help message.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance with which the
|
|
flag will be registered. This should almost never need to be overridden.
|
|
module_name: A string, the name of the Python module declaring this flag. If
|
|
not provided, it will be computed using the stack trace of this call.
|
|
required: bool, is this a required flag. This must be used as a keyword
|
|
argument.
|
|
**args: Dictionary with extra keyword args that are passed to the
|
|
``Flag.__init__``.
|
|
|
|
Returns:
|
|
a handle to defined flag.
|
|
"""
|
|
result = DEFINE_flag(
|
|
_flag.MultiFlag(parser, serializer, name, default, help, **args),
|
|
flag_values,
|
|
module_name,
|
|
required=True if required else False,
|
|
)
|
|
return result
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi_string( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[None, Iterable[Text], Text],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
*,
|
|
required: 'typing.Literal[True]',
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[Text]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi_string( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: None,
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Optional[List[Text]]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi_string( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[Iterable[Text], Text],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[Text]]:
|
|
...
|
|
|
|
|
|
def DEFINE_multi_string( # pylint: disable=invalid-name,redefined-builtin
|
|
name,
|
|
default,
|
|
help,
|
|
flag_values=_flagvalues.FLAGS,
|
|
required=False,
|
|
**args):
|
|
"""Registers a flag whose value can be a list of any strings.
|
|
|
|
Use the flag on the command line multiple times to place multiple
|
|
string values into the list. The 'default' may be a single string
|
|
(which will be converted into a single-element list) or a list of
|
|
strings.
|
|
|
|
|
|
Args:
|
|
name: str, the flag name.
|
|
default: Union[Iterable[Text], Text, None], the default value of the flag;
|
|
see :func:`DEFINE_multi`.
|
|
help: str, the help message.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance with which the
|
|
flag will be registered. This should almost never need to be overridden.
|
|
required: bool, is this a required flag. This must be used as a keyword
|
|
argument.
|
|
**args: Dictionary with extra keyword args that are passed to the
|
|
``Flag.__init__``.
|
|
|
|
Returns:
|
|
a handle to defined flag.
|
|
"""
|
|
parser = _argument_parser.ArgumentParser()
|
|
serializer = _argument_parser.ArgumentSerializer()
|
|
return DEFINE_multi(
|
|
parser,
|
|
serializer,
|
|
name,
|
|
default,
|
|
help,
|
|
flag_values,
|
|
required=True if required else False,
|
|
**args,
|
|
)
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi_integer( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[None, Iterable[int], int, Text],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
lower_bound: Optional[int] = ...,
|
|
upper_bound: Optional[int] = ...,
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
*,
|
|
required: 'typing.Literal[True]',
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[int]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi_integer( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: None,
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
lower_bound: Optional[int] = ...,
|
|
upper_bound: Optional[int] = ...,
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Optional[List[int]]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi_integer( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[Iterable[int], int, Text],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
lower_bound: Optional[int] = ...,
|
|
upper_bound: Optional[int] = ...,
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[int]]:
|
|
...
|
|
|
|
|
|
def DEFINE_multi_integer( # pylint: disable=invalid-name,redefined-builtin
|
|
name,
|
|
default,
|
|
help,
|
|
lower_bound=None,
|
|
upper_bound=None,
|
|
flag_values=_flagvalues.FLAGS,
|
|
required=False,
|
|
**args):
|
|
"""Registers a flag whose value can be a list of arbitrary integers.
|
|
|
|
Use the flag on the command line multiple times to place multiple
|
|
integer values into the list. The 'default' may be a single integer
|
|
(which will be converted into a single-element list) or a list of
|
|
integers.
|
|
|
|
Args:
|
|
name: str, the flag name.
|
|
default: Union[Iterable[int], Text, None], the default value of the flag;
|
|
see `DEFINE_multi`.
|
|
help: str, the help message.
|
|
lower_bound: int, min values of the flag.
|
|
upper_bound: int, max values of the flag.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance with which the
|
|
flag will be registered. This should almost never need to be overridden.
|
|
required: bool, is this a required flag. This must be used as a keyword
|
|
argument.
|
|
**args: Dictionary with extra keyword args that are passed to the
|
|
``Flag.__init__``.
|
|
|
|
Returns:
|
|
a handle to defined flag.
|
|
"""
|
|
parser = _argument_parser.IntegerParser(lower_bound, upper_bound)
|
|
serializer = _argument_parser.ArgumentSerializer()
|
|
return DEFINE_multi(
|
|
parser,
|
|
serializer,
|
|
name,
|
|
default,
|
|
help,
|
|
flag_values,
|
|
required=True if required else False,
|
|
**args,
|
|
)
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi_float( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[None, Iterable[float], float, Text],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
lower_bound: Optional[float] = ...,
|
|
upper_bound: Optional[float] = ...,
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
*,
|
|
required: 'typing.Literal[True]',
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[float]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi_float( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: None,
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
lower_bound: Optional[float] = ...,
|
|
upper_bound: Optional[float] = ...,
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Optional[List[float]]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi_float( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[Iterable[float], float, Text],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
lower_bound: Optional[float] = ...,
|
|
upper_bound: Optional[float] = ...,
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[float]]:
|
|
...
|
|
|
|
|
|
def DEFINE_multi_float( # pylint: disable=invalid-name,redefined-builtin
|
|
name,
|
|
default,
|
|
help,
|
|
lower_bound=None,
|
|
upper_bound=None,
|
|
flag_values=_flagvalues.FLAGS,
|
|
required=False,
|
|
**args):
|
|
"""Registers a flag whose value can be a list of arbitrary floats.
|
|
|
|
Use the flag on the command line multiple times to place multiple
|
|
float values into the list. The 'default' may be a single float
|
|
(which will be converted into a single-element list) or a list of
|
|
floats.
|
|
|
|
Args:
|
|
name: str, the flag name.
|
|
default: Union[Iterable[float], Text, None], the default value of the flag;
|
|
see `DEFINE_multi`.
|
|
help: str, the help message.
|
|
lower_bound: float, min values of the flag.
|
|
upper_bound: float, max values of the flag.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance with which the
|
|
flag will be registered. This should almost never need to be overridden.
|
|
required: bool, is this a required flag. This must be used as a keyword
|
|
argument.
|
|
**args: Dictionary with extra keyword args that are passed to the
|
|
``Flag.__init__``.
|
|
|
|
Returns:
|
|
a handle to defined flag.
|
|
"""
|
|
parser = _argument_parser.FloatParser(lower_bound, upper_bound)
|
|
serializer = _argument_parser.ArgumentSerializer()
|
|
return DEFINE_multi(
|
|
parser,
|
|
serializer,
|
|
name,
|
|
default,
|
|
help,
|
|
flag_values,
|
|
required=True if required else False,
|
|
**args,
|
|
)
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi_enum( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[None, Iterable[Text], Text],
|
|
enum_values: Iterable[Text],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
*,
|
|
required: 'typing.Literal[True]',
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[Text]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi_enum( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: None,
|
|
enum_values: Iterable[Text],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Optional[List[Text]]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi_enum( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[Iterable[Text], Text],
|
|
enum_values: Iterable[Text],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[Text]]:
|
|
...
|
|
|
|
|
|
def DEFINE_multi_enum( # pylint: disable=invalid-name,redefined-builtin
|
|
name,
|
|
default,
|
|
enum_values,
|
|
help,
|
|
flag_values=_flagvalues.FLAGS,
|
|
case_sensitive=True,
|
|
required=False,
|
|
**args):
|
|
"""Registers a flag whose value can be a list strings from enum_values.
|
|
|
|
Use the flag on the command line multiple times to place multiple
|
|
enum values into the list. The 'default' may be a single string
|
|
(which will be converted into a single-element list) or a list of
|
|
strings.
|
|
|
|
Args:
|
|
name: str, the flag name.
|
|
default: Union[Iterable[Text], Text, None], the default value of the flag;
|
|
see `DEFINE_multi`.
|
|
enum_values: [str], a non-empty list of strings with the possible values for
|
|
the flag.
|
|
help: str, the help message.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance with which the
|
|
flag will be registered. This should almost never need to be overridden.
|
|
case_sensitive: Whether or not the enum is to be case-sensitive.
|
|
required: bool, is this a required flag. This must be used as a keyword
|
|
argument.
|
|
**args: Dictionary with extra keyword args that are passed to the
|
|
``Flag.__init__``.
|
|
|
|
Returns:
|
|
a handle to defined flag.
|
|
"""
|
|
parser = _argument_parser.EnumParser(enum_values, case_sensitive)
|
|
serializer = _argument_parser.ArgumentSerializer()
|
|
return DEFINE_multi(
|
|
parser,
|
|
serializer,
|
|
name,
|
|
default,
|
|
'<%s>: %s' % ('|'.join(enum_values), help),
|
|
flag_values,
|
|
required=True if required else False,
|
|
**args,
|
|
)
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi_enum_class( # pylint: disable=invalid-name
|
|
name: Text,
|
|
# This is separate from `Union[None, _ET, Iterable[Text], Text]` to avoid a
|
|
# Pytype issue inferring the return value to
|
|
# FlagHolder[List[Union[_ET, enum.Enum]]] when an iterable of concrete enum
|
|
# subclasses are used.
|
|
default: Iterable[_ET],
|
|
enum_class: Type[_ET],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
*,
|
|
required: 'typing.Literal[True]',
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[_ET]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi_enum_class( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[None, _ET, Iterable[Text], Text],
|
|
enum_class: Type[_ET],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
*,
|
|
required: 'typing.Literal[True]',
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[_ET]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi_enum_class( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: None,
|
|
enum_class: Type[_ET],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[Optional[List[_ET]]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi_enum_class( # pylint: disable=invalid-name
|
|
name: Text,
|
|
# This is separate from `Union[None, _ET, Iterable[Text], Text]` to avoid a
|
|
# Pytype issue inferring the return value to
|
|
# FlagHolder[List[Union[_ET, enum.Enum]]] when an iterable of concrete enum
|
|
# subclasses are used.
|
|
default: Iterable[_ET],
|
|
enum_class: Type[_ET],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[_ET]]:
|
|
...
|
|
|
|
|
|
@overload
|
|
def DEFINE_multi_enum_class( # pylint: disable=invalid-name
|
|
name: Text,
|
|
default: Union[_ET, Iterable[Text], Text],
|
|
enum_class: Type[_ET],
|
|
help: Text, # pylint: disable=redefined-builtin
|
|
flag_values: _flagvalues.FlagValues = ...,
|
|
module_name: Optional[Text] = ...,
|
|
required: bool = ...,
|
|
**args: Any
|
|
) -> _flagvalues.FlagHolder[List[_ET]]:
|
|
...
|
|
|
|
|
|
def DEFINE_multi_enum_class( # pylint: disable=invalid-name,redefined-builtin
|
|
name,
|
|
default,
|
|
enum_class,
|
|
help,
|
|
flag_values=_flagvalues.FLAGS,
|
|
module_name=None,
|
|
case_sensitive=False,
|
|
required=False,
|
|
**args):
|
|
"""Registers a flag whose value can be a list of enum members.
|
|
|
|
Use the flag on the command line multiple times to place multiple
|
|
enum values into the list.
|
|
|
|
Args:
|
|
name: str, the flag name.
|
|
default: Union[Iterable[Enum], Iterable[Text], Enum, Text, None], the
|
|
default value of the flag; see `DEFINE_multi`; only differences are
|
|
documented here. If the value is a single Enum, it is treated as a
|
|
single-item list of that Enum value. If it is an iterable, text values
|
|
within the iterable will be converted to the equivalent Enum objects.
|
|
enum_class: class, the Enum class with all the possible values for the flag.
|
|
help: str, the help message.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance with which the
|
|
flag will be registered. This should almost never need to be overridden.
|
|
module_name: A string, the name of the Python module declaring this flag. If
|
|
not provided, it will be computed using the stack trace of this call.
|
|
case_sensitive: bool, whether to map strings to members of the enum_class
|
|
without considering case.
|
|
required: bool, is this a required flag. This must be used as a keyword
|
|
argument.
|
|
**args: Dictionary with extra keyword args that are passed to the
|
|
``Flag.__init__``.
|
|
|
|
Returns:
|
|
a handle to defined flag.
|
|
"""
|
|
# NOTE: pytype fails if this is a direct return.
|
|
result = DEFINE_flag(
|
|
_flag.MultiEnumClassFlag(
|
|
name,
|
|
default,
|
|
help,
|
|
enum_class,
|
|
case_sensitive=case_sensitive,
|
|
**args,
|
|
),
|
|
flag_values,
|
|
module_name,
|
|
required=True if required else False,
|
|
)
|
|
return result
|
|
|
|
|
|
def DEFINE_alias( # pylint: disable=invalid-name
|
|
name: Text,
|
|
original_name: Text,
|
|
flag_values: _flagvalues.FlagValues = _flagvalues.FLAGS,
|
|
module_name: Optional[Text] = None,
|
|
) -> _flagvalues.FlagHolder[Any]:
|
|
"""Defines an alias flag for an existing one.
|
|
|
|
Args:
|
|
name: str, the flag name.
|
|
original_name: str, the original flag name.
|
|
flag_values: :class:`FlagValues`, the FlagValues instance with which the
|
|
flag will be registered. This should almost never need to be overridden.
|
|
module_name: A string, the name of the module that defines this flag.
|
|
|
|
Returns:
|
|
a handle to defined flag.
|
|
|
|
Raises:
|
|
flags.FlagError:
|
|
UnrecognizedFlagError: if the referenced flag doesn't exist.
|
|
DuplicateFlagError: if the alias name has been used by some existing flag.
|
|
"""
|
|
if original_name not in flag_values:
|
|
raise _exceptions.UnrecognizedFlagError(original_name)
|
|
flag = flag_values[original_name]
|
|
|
|
class _FlagAlias(_flag.Flag):
|
|
"""Overrides Flag class so alias value is copy of original flag value."""
|
|
|
|
def parse(self, argument):
|
|
flag.parse(argument)
|
|
self.present += 1
|
|
|
|
def _parse_from_default(self, value):
|
|
# The value was already parsed by the aliased flag, so there is no
|
|
# need to call the parser on it a second time.
|
|
# Additionally, because of how MultiFlag parses and merges values,
|
|
# it isn't possible to delegate to the aliased flag and still get
|
|
# the correct values.
|
|
return value
|
|
|
|
@property
|
|
def value(self):
|
|
return flag.value
|
|
|
|
@value.setter
|
|
def value(self, value):
|
|
flag.value = value
|
|
|
|
help_msg = 'Alias for --%s.' % flag.name
|
|
# If alias_name has been used, flags.DuplicatedFlag will be raised.
|
|
return DEFINE_flag(
|
|
_FlagAlias(
|
|
flag.parser,
|
|
flag.serializer,
|
|
name,
|
|
flag.default,
|
|
help_msg,
|
|
boolean=flag.boolean), flag_values, module_name)
|