1# Copyright 2017 The Abseil Authors.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#      http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14"""This modules contains flags DEFINE functions.
15
16Do NOT import this module directly. Import the flags package and use the
17aliases defined at the package level instead.
18"""
19
20import enum
21import sys
22import types
23import typing
24from typing import Text, List, Any, TypeVar, Optional, Union, Type, Iterable, overload
25
26from absl.flags import _argument_parser
27from absl.flags import _exceptions
28from absl.flags import _flag
29from absl.flags import _flagvalues
30from absl.flags import _helpers
31from absl.flags import _validators
32
33_helpers.disclaim_module_ids.add(id(sys.modules[__name__]))
34
35_T = TypeVar('_T')
36_ET = TypeVar('_ET', bound=enum.Enum)
37
38
39def _register_bounds_validator_if_needed(parser, name, flag_values):
40  """Enforces lower and upper bounds for numeric flags.
41
42  Args:
43    parser: NumericParser (either FloatParser or IntegerParser), provides lower
44      and upper bounds, and help text to display.
45    name: str, name of the flag
46    flag_values: FlagValues.
47  """
48  if parser.lower_bound is not None or parser.upper_bound is not None:
49
50    def checker(value):
51      if value is not None and parser.is_outside_bounds(value):
52        message = '%s is not %s' % (value, parser.syntactic_help)
53        raise _exceptions.ValidationError(message)
54      return True
55
56    _validators.register_validator(name, checker, flag_values=flag_values)
57
58
59@overload
60def DEFINE(  # pylint: disable=invalid-name
61    parser: _argument_parser.ArgumentParser[_T],
62    name: Text,
63    default: Any,
64    help: Optional[Text],  # pylint: disable=redefined-builtin
65    flag_values: _flagvalues.FlagValues = ...,
66    serializer: Optional[_argument_parser.ArgumentSerializer[_T]] = ...,
67    module_name: Optional[Text] = ...,
68    required: 'typing.Literal[True]' = ...,
69    **args: Any
70) -> _flagvalues.FlagHolder[_T]:
71  ...
72
73
74@overload
75def DEFINE(  # pylint: disable=invalid-name
76    parser: _argument_parser.ArgumentParser[_T],
77    name: Text,
78    default: Optional[Any],
79    help: Optional[Text],  # pylint: disable=redefined-builtin
80    flag_values: _flagvalues.FlagValues = ...,
81    serializer: Optional[_argument_parser.ArgumentSerializer[_T]] = ...,
82    module_name: Optional[Text] = ...,
83    required: bool = ...,
84    **args: Any
85) -> _flagvalues.FlagHolder[Optional[_T]]:
86  ...
87
88
89def DEFINE(  # pylint: disable=invalid-name
90    parser,
91    name,
92    default,
93    help,  # pylint: disable=redefined-builtin
94    flag_values=_flagvalues.FLAGS,
95    serializer=None,
96    module_name=None,
97    required=False,
98    **args):
99  """Registers a generic Flag object.
100
101  NOTE: in the docstrings of all DEFINE* functions, "registers" is short
102  for "creates a new flag and registers it".
103
104  Auxiliary function: clients should use the specialized ``DEFINE_<type>``
105  function instead.
106
107  Args:
108    parser: :class:`ArgumentParser`, used to parse the flag arguments.
109    name: str, the flag name.
110    default: The default value of the flag.
111    help: str, the help message.
112    flag_values: :class:`FlagValues`, the FlagValues instance with which the
113      flag will be registered. This should almost never need to be overridden.
114    serializer: :class:`ArgumentSerializer`, the flag serializer instance.
115    module_name: str, the name of the Python module declaring this flag. If not
116      provided, it will be computed using the stack trace of this call.
117    required: bool, is this a required flag. This must be used as a keyword
118      argument.
119    **args: dict, the extra keyword args that are passed to ``Flag.__init__``.
120
121  Returns:
122    a handle to defined flag.
123  """
124  return DEFINE_flag(
125      _flag.Flag(parser, serializer, name, default, help, **args),
126      flag_values,
127      module_name,
128      required=True if required else False,
129  )
130
131
132@overload
133def DEFINE_flag(  # pylint: disable=invalid-name
134    flag: _flag.Flag[_T],
135    flag_values: _flagvalues.FlagValues = ...,
136    module_name: Optional[Text] = ...,
137    required: 'typing.Literal[True]' = ...,
138) -> _flagvalues.FlagHolder[_T]:
139  ...
140
141
142@overload
143def DEFINE_flag(  # pylint: disable=invalid-name
144    flag: _flag.Flag[_T],
145    flag_values: _flagvalues.FlagValues = ...,
146    module_name: Optional[Text] = ...,
147    required: bool = ...,
148) -> _flagvalues.FlagHolder[Optional[_T]]:
149  ...
150
151
152def DEFINE_flag(  # pylint: disable=invalid-name
153    flag,
154    flag_values=_flagvalues.FLAGS,
155    module_name=None,
156    required=False):
157  """Registers a :class:`Flag` object with a :class:`FlagValues` object.
158
159  By default, the global :const:`FLAGS` ``FlagValue`` object is used.
160
161  Typical users will use one of the more specialized DEFINE_xxx
162  functions, such as :func:`DEFINE_string` or :func:`DEFINE_integer`.  But
163  developers who need to create :class:`Flag` objects themselves should use
164  this function to register their flags.
165
166  Args:
167    flag: :class:`Flag`, a flag that is key to the module.
168    flag_values: :class:`FlagValues`, the ``FlagValues`` instance with which the
169      flag will be registered. This should almost never need to be overridden.
170    module_name: str, the name of the Python module declaring this flag. If not
171      provided, it will be computed using the stack trace of this call.
172    required: bool, is this a required flag. This must be used as a keyword
173      argument.
174
175  Returns:
176    a handle to defined flag.
177  """
178  if required and flag.default is not None:
179    raise ValueError('Required flag --%s cannot have a non-None default' %
180                     flag.name)
181  # Copying the reference to flag_values prevents pychecker warnings.
182  fv = flag_values
183  fv[flag.name] = flag
184  # Tell flag_values who's defining the flag.
185  if module_name:
186    module = sys.modules.get(module_name)
187  else:
188    module, module_name = _helpers.get_calling_module_object_and_name()
189  flag_values.register_flag_by_module(module_name, flag)
190  flag_values.register_flag_by_module_id(id(module), flag)
191  if required:
192    _validators.mark_flag_as_required(flag.name, fv)
193  ensure_non_none_value = (flag.default is not None) or required
194  return _flagvalues.FlagHolder(
195      fv, flag, ensure_non_none_value=ensure_non_none_value)
196
197
198def set_default(flag_holder: _flagvalues.FlagHolder[_T], value: _T) -> None:
199  """Changes the default value of the provided flag object.
200
201  The flag's current value is also updated if the flag is currently using
202  the default value, i.e. not specified in the command line, and not set
203  by FLAGS.name = value.
204
205  Args:
206    flag_holder: FlagHolder, the flag to modify.
207    value: The new default value.
208
209  Raises:
210    IllegalFlagValueError: Raised when value is not valid.
211  """
212  flag_holder._flagvalues.set_default(flag_holder.name, value)  # pylint: disable=protected-access
213
214
215def override_value(flag_holder: _flagvalues.FlagHolder[_T], value: _T) -> None:
216  """Overrides the value of the provided flag.
217
218  This value takes precedent over the default value and, when called after flag
219  parsing, any value provided at the command line.
220
221  Args:
222    flag_holder: FlagHolder, the flag to modify.
223    value: The new value.
224
225  Raises:
226    IllegalFlagValueError: The value did not pass the flag parser or validators.
227  """
228  fv = flag_holder._flagvalues  # pylint: disable=protected-access
229  # Ensure the new value satisfies the flag's parser while avoiding side
230  # effects of calling parse().
231  parsed = fv[flag_holder.name]._parse(value)  # pylint: disable=protected-access
232  if parsed != value:
233    raise _exceptions.IllegalFlagValueError(
234        'flag %s: parsed value %r not equal to original %r'
235        % (flag_holder.name, parsed, value)
236    )
237  setattr(fv, flag_holder.name, value)
238
239
240def _internal_declare_key_flags(
241    flag_names: List[str],
242    flag_values: _flagvalues.FlagValues = _flagvalues.FLAGS,
243    key_flag_values: Optional[_flagvalues.FlagValues] = None,
244) -> None:
245  """Declares a flag as key for the calling module.
246
247  Internal function.  User code should call declare_key_flag or
248  adopt_module_key_flags instead.
249
250  Args:
251    flag_names: [str], a list of names of already-registered Flag objects.
252    flag_values: :class:`FlagValues`, the FlagValues instance with which the
253      flags listed in flag_names have registered (the value of the flag_values
254      argument from the ``DEFINE_*`` calls that defined those flags). This
255      should almost never need to be overridden.
256    key_flag_values: :class:`FlagValues`, the FlagValues instance that (among
257      possibly many other things) keeps track of the key flags for each module.
258      Default ``None`` means "same as flag_values".  This should almost never
259      need to be overridden.
260
261  Raises:
262    UnrecognizedFlagError: Raised when the flag is not defined.
263  """
264  key_flag_values = key_flag_values or flag_values
265
266  module = _helpers.get_calling_module()
267
268  for flag_name in flag_names:
269    key_flag_values.register_key_flag_for_module(module, flag_values[flag_name])
270
271
272def declare_key_flag(
273    flag_name: Union[Text, _flagvalues.FlagHolder],
274    flag_values: _flagvalues.FlagValues = _flagvalues.FLAGS,
275) -> None:
276  """Declares one flag as key to the current module.
277
278  Key flags are flags that are deemed really important for a module.
279  They are important when listing help messages; e.g., if the
280  --helpshort command-line flag is used, then only the key flags of the
281  main module are listed (instead of all flags, as in the case of
282  --helpfull).
283
284  Sample usage::
285
286      flags.declare_key_flag('flag_1')
287
288  Args:
289    flag_name: str | :class:`FlagHolder`, the name or holder of an already
290      declared flag. (Redeclaring flags as key, including flags implicitly key
291      because they were declared in this module, is a no-op.)
292      Positional-only parameter.
293    flag_values: :class:`FlagValues`, the FlagValues instance in which the
294      flag will be declared as a key flag. This should almost never need to be
295      overridden.
296
297  Raises:
298    ValueError: Raised if flag_name not defined as a Python flag.
299  """
300  flag_name, flag_values = _flagvalues.resolve_flag_ref(flag_name, flag_values)
301  if flag_name in _helpers.SPECIAL_FLAGS:
302    # Take care of the special flags, e.g., --flagfile, --undefok.
303    # These flags are defined in SPECIAL_FLAGS, and are treated
304    # specially during flag parsing, taking precedence over the
305    # user-defined flags.
306    _internal_declare_key_flags([flag_name],
307                                flag_values=_helpers.SPECIAL_FLAGS,
308                                key_flag_values=flag_values)
309    return
310  try:
311    _internal_declare_key_flags([flag_name], flag_values=flag_values)
312  except KeyError:
313    raise ValueError('Flag --%s is undefined. To set a flag as a key flag '
314                     'first define it in Python.' % flag_name)
315
316
317def adopt_module_key_flags(
318    module: Any, flag_values: _flagvalues.FlagValues = _flagvalues.FLAGS
319) -> None:
320  """Declares that all flags key to a module are key to the current module.
321
322  Args:
323    module: module, the module object from which all key flags will be declared
324      as key flags to the current module.
325    flag_values: :class:`FlagValues`, the FlagValues instance in which the
326      flags will be declared as key flags. This should almost never need to be
327      overridden.
328
329  Raises:
330    Error: Raised when given an argument that is a module name (a string),
331        instead of a module object.
332  """
333  if not isinstance(module, types.ModuleType):
334    raise _exceptions.Error('Expected a module object, not %r.' % (module,))
335  _internal_declare_key_flags(
336      [f.name for f in flag_values.get_key_flags_for_module(module.__name__)],
337      flag_values=flag_values)
338  # If module is this flag module, take _helpers.SPECIAL_FLAGS into account.
339  if module == _helpers.FLAGS_MODULE:
340    _internal_declare_key_flags(
341        # As we associate flags with get_calling_module_object_and_name(), the
342        # special flags defined in this module are incorrectly registered with
343        # a different module.  So, we can't use get_key_flags_for_module.
344        # Instead, we take all flags from _helpers.SPECIAL_FLAGS (a private
345        # FlagValues, where no other module should register flags).
346        [_helpers.SPECIAL_FLAGS[name].name for name in _helpers.SPECIAL_FLAGS],
347        flag_values=_helpers.SPECIAL_FLAGS,
348        key_flag_values=flag_values)
349
350
351def disclaim_key_flags() -> None:
352  """Declares that the current module will not define any more key flags.
353
354  Normally, the module that calls the DEFINE_xxx functions claims the
355  flag to be its key flag.  This is undesirable for modules that
356  define additional DEFINE_yyy functions with its own flag parsers and
357  serializers, since that module will accidentally claim flags defined
358  by DEFINE_yyy as its key flags.  After calling this function, the
359  module disclaims flag definitions thereafter, so the key flags will
360  be correctly attributed to the caller of DEFINE_yyy.
361
362  After calling this function, the module will not be able to define
363  any more flags.  This function will affect all FlagValues objects.
364  """
365  globals_for_caller = sys._getframe(1).f_globals  # pylint: disable=protected-access
366  module, _ = _helpers.get_module_object_and_name(globals_for_caller)
367  _helpers.disclaim_module_ids.add(id(module))
368
369
370@overload
371def DEFINE_string(  # pylint: disable=invalid-name
372    name: Text,
373    default: Optional[Text],
374    help: Optional[Text],  # pylint: disable=redefined-builtin
375    flag_values: _flagvalues.FlagValues = ...,
376    *,
377    required: 'typing.Literal[True]',
378    **args: Any
379) -> _flagvalues.FlagHolder[Text]:
380  ...
381
382
383@overload
384def DEFINE_string(  # pylint: disable=invalid-name
385    name: Text,
386    default: None,
387    help: Optional[Text],  # pylint: disable=redefined-builtin
388    flag_values: _flagvalues.FlagValues = ...,
389    required: bool = ...,
390    **args: Any
391) -> _flagvalues.FlagHolder[Optional[Text]]:
392  ...
393
394
395@overload
396def DEFINE_string(  # pylint: disable=invalid-name
397    name: Text,
398    default: Text,
399    help: Optional[Text],  # pylint: disable=redefined-builtin
400    flag_values: _flagvalues.FlagValues = ...,
401    required: bool = ...,
402    **args: Any
403) -> _flagvalues.FlagHolder[Text]:
404  ...
405
406
407def DEFINE_string(  # pylint: disable=invalid-name,redefined-builtin
408    name,
409    default,
410    help,
411    flag_values=_flagvalues.FLAGS,
412    required=False,
413    **args):
414  """Registers a flag whose value can be any string."""
415  parser = _argument_parser.ArgumentParser[str]()
416  serializer = _argument_parser.ArgumentSerializer[str]()
417  return DEFINE(
418      parser,
419      name,
420      default,
421      help,
422      flag_values,
423      serializer,
424      required=True if required else False,
425      **args,
426  )
427
428
429@overload
430def DEFINE_boolean(  # pylint: disable=invalid-name
431    name: Text,
432    default: Union[None, Text, bool, int],
433    help: Optional[Text],  # pylint: disable=redefined-builtin
434    flag_values: _flagvalues.FlagValues = ...,
435    module_name: Optional[Text] = ...,
436    *,
437    required: 'typing.Literal[True]',
438    **args: Any
439) -> _flagvalues.FlagHolder[bool]:
440  ...
441
442
443@overload
444def DEFINE_boolean(  # pylint: disable=invalid-name
445    name: Text,
446    default: None,
447    help: Optional[Text],  # pylint: disable=redefined-builtin
448    flag_values: _flagvalues.FlagValues = ...,
449    module_name: Optional[Text] = ...,
450    required: bool = ...,
451    **args: Any
452) -> _flagvalues.FlagHolder[Optional[bool]]:
453  ...
454
455
456@overload
457def DEFINE_boolean(  # pylint: disable=invalid-name
458    name: Text,
459    default: Union[Text, bool, int],
460    help: Optional[Text],  # pylint: disable=redefined-builtin
461    flag_values: _flagvalues.FlagValues = ...,
462    module_name: Optional[Text] = ...,
463    required: bool = ...,
464    **args: Any
465) -> _flagvalues.FlagHolder[bool]:
466  ...
467
468
469def DEFINE_boolean(  # pylint: disable=invalid-name,redefined-builtin
470    name,
471    default,
472    help,
473    flag_values=_flagvalues.FLAGS,
474    module_name=None,
475    required=False,
476    **args):
477  """Registers a boolean flag.
478
479  Such a boolean flag does not take an argument.  If a user wants to
480  specify a false value explicitly, the long option beginning with 'no'
481  must be used: i.e. --noflag
482
483  This flag will have a value of None, True or False.  None is possible
484  if default=None and the user does not specify the flag on the command
485  line.
486
487  Args:
488    name: str, the flag name.
489    default: bool|str|None, the default value of the flag.
490    help: str, the help message.
491    flag_values: :class:`FlagValues`, the FlagValues instance with which the
492      flag will be registered. This should almost never need to be overridden.
493    module_name: str, the name of the Python module declaring this flag. If not
494      provided, it will be computed using the stack trace of this call.
495    required: bool, is this a required flag. This must be used as a keyword
496      argument.
497    **args: dict, the extra keyword args that are passed to ``Flag.__init__``.
498
499  Returns:
500    a handle to defined flag.
501  """
502  return DEFINE_flag(
503      _flag.BooleanFlag(name, default, help, **args),
504      flag_values,
505      module_name,
506      required=True if required else False,
507  )
508
509
510@overload
511def DEFINE_float(  # pylint: disable=invalid-name
512    name: Text,
513    default: Union[None, float, Text],
514    help: Optional[Text],  # pylint: disable=redefined-builtin
515    lower_bound: Optional[float] = ...,
516    upper_bound: Optional[float] = ...,
517    flag_values: _flagvalues.FlagValues = ...,
518    *,
519    required: 'typing.Literal[True]',
520    **args: Any
521) -> _flagvalues.FlagHolder[float]:
522  ...
523
524
525@overload
526def DEFINE_float(  # pylint: disable=invalid-name
527    name: Text,
528    default: None,
529    help: Optional[Text],  # pylint: disable=redefined-builtin
530    lower_bound: Optional[float] = ...,
531    upper_bound: Optional[float] = ...,
532    flag_values: _flagvalues.FlagValues = ...,
533    required: bool = ...,
534    **args: Any
535) -> _flagvalues.FlagHolder[Optional[float]]:
536  ...
537
538
539@overload
540def DEFINE_float(  # pylint: disable=invalid-name
541    name: Text,
542    default: Union[float, Text],
543    help: Optional[Text],  # pylint: disable=redefined-builtin
544    lower_bound: Optional[float] = ...,
545    upper_bound: Optional[float] = ...,
546    flag_values: _flagvalues.FlagValues = ...,
547    required: bool = ...,
548    **args: Any
549) -> _flagvalues.FlagHolder[float]:
550  ...
551
552
553def DEFINE_float(  # pylint: disable=invalid-name,redefined-builtin
554    name,
555    default,
556    help,
557    lower_bound=None,
558    upper_bound=None,
559    flag_values=_flagvalues.FLAGS,
560    required=False,
561    **args):
562  """Registers a flag whose value must be a float.
563
564  If ``lower_bound`` or ``upper_bound`` are set, then this flag must be
565  within the given range.
566
567  Args:
568    name: str, the flag name.
569    default: float|str|None, the default value of the flag.
570    help: str, the help message.
571    lower_bound: float, min value of the flag.
572    upper_bound: float, max value of the flag.
573    flag_values: :class:`FlagValues`, the FlagValues instance with which the
574      flag will be registered. This should almost never need to be overridden.
575    required: bool, is this a required flag. This must be used as a keyword
576      argument.
577    **args: dict, the extra keyword args that are passed to :func:`DEFINE`.
578
579  Returns:
580    a handle to defined flag.
581  """
582  parser = _argument_parser.FloatParser(lower_bound, upper_bound)
583  serializer = _argument_parser.ArgumentSerializer()
584  result = DEFINE(
585      parser,
586      name,
587      default,
588      help,
589      flag_values,
590      serializer,
591      required=True if required else False,
592      **args,
593  )
594  _register_bounds_validator_if_needed(parser, name, flag_values=flag_values)
595  return result
596
597
598@overload
599def DEFINE_integer(  # pylint: disable=invalid-name
600    name: Text,
601    default: Union[None, int, Text],
602    help: Optional[Text],  # pylint: disable=redefined-builtin
603    lower_bound: Optional[int] = ...,
604    upper_bound: Optional[int] = ...,
605    flag_values: _flagvalues.FlagValues = ...,
606    *,
607    required: 'typing.Literal[True]',
608    **args: Any
609) -> _flagvalues.FlagHolder[int]:
610  ...
611
612
613@overload
614def DEFINE_integer(  # pylint: disable=invalid-name
615    name: Text,
616    default: None,
617    help: Optional[Text],  # pylint: disable=redefined-builtin
618    lower_bound: Optional[int] = ...,
619    upper_bound: Optional[int] = ...,
620    flag_values: _flagvalues.FlagValues = ...,
621    required: bool = ...,
622    **args: Any
623) -> _flagvalues.FlagHolder[Optional[int]]:
624  ...
625
626
627@overload
628def DEFINE_integer(  # pylint: disable=invalid-name
629    name: Text,
630    default: Union[int, Text],
631    help: Optional[Text],  # pylint: disable=redefined-builtin
632    lower_bound: Optional[int] = ...,
633    upper_bound: Optional[int] = ...,
634    flag_values: _flagvalues.FlagValues = ...,
635    required: bool = ...,
636    **args: Any
637) -> _flagvalues.FlagHolder[int]:
638  ...
639
640
641def DEFINE_integer(  # pylint: disable=invalid-name,redefined-builtin
642    name,
643    default,
644    help,
645    lower_bound=None,
646    upper_bound=None,
647    flag_values=_flagvalues.FLAGS,
648    required=False,
649    **args):
650  """Registers a flag whose value must be an integer.
651
652  If ``lower_bound``, or ``upper_bound`` are set, then this flag must be
653  within the given range.
654
655  Args:
656    name: str, the flag name.
657    default: int|str|None, the default value of the flag.
658    help: str, the help message.
659    lower_bound: int, min value of the flag.
660    upper_bound: int, max value of the flag.
661    flag_values: :class:`FlagValues`, the FlagValues instance with which the
662      flag will be registered. This should almost never need to be overridden.
663    required: bool, is this a required flag. This must be used as a keyword
664      argument.
665    **args: dict, the extra keyword args that are passed to :func:`DEFINE`.
666
667  Returns:
668    a handle to defined flag.
669  """
670  parser = _argument_parser.IntegerParser(lower_bound, upper_bound)
671  serializer = _argument_parser.ArgumentSerializer()
672  result = DEFINE(
673      parser,
674      name,
675      default,
676      help,
677      flag_values,
678      serializer,
679      required=True if required else False,
680      **args,
681  )
682  _register_bounds_validator_if_needed(parser, name, flag_values=flag_values)
683  return result
684
685
686@overload
687def DEFINE_enum(  # pylint: disable=invalid-name
688    name: Text,
689    default: Optional[Text],
690    enum_values: Iterable[Text],
691    help: Optional[Text],  # pylint: disable=redefined-builtin
692    flag_values: _flagvalues.FlagValues = ...,
693    module_name: Optional[Text] = ...,
694    *,
695    required: 'typing.Literal[True]',
696    **args: Any
697) -> _flagvalues.FlagHolder[Text]:
698  ...
699
700
701@overload
702def DEFINE_enum(  # pylint: disable=invalid-name
703    name: Text,
704    default: None,
705    enum_values: Iterable[Text],
706    help: Optional[Text],  # pylint: disable=redefined-builtin
707    flag_values: _flagvalues.FlagValues = ...,
708    module_name: Optional[Text] = ...,
709    required: bool = ...,
710    **args: Any
711) -> _flagvalues.FlagHolder[Optional[Text]]:
712  ...
713
714
715@overload
716def DEFINE_enum(  # pylint: disable=invalid-name
717    name: Text,
718    default: Text,
719    enum_values: Iterable[Text],
720    help: Optional[Text],  # pylint: disable=redefined-builtin
721    flag_values: _flagvalues.FlagValues = ...,
722    module_name: Optional[Text] = ...,
723    required: bool = ...,
724    **args: Any
725) -> _flagvalues.FlagHolder[Text]:
726  ...
727
728
729def DEFINE_enum(  # pylint: disable=invalid-name,redefined-builtin
730    name,
731    default,
732    enum_values,
733    help,
734    flag_values=_flagvalues.FLAGS,
735    module_name=None,
736    required=False,
737    **args):
738  """Registers a flag whose value can be any string from enum_values.
739
740  Instead of a string enum, prefer `DEFINE_enum_class`, which allows
741  defining enums from an `enum.Enum` class.
742
743  Args:
744    name: str, the flag name.
745    default: str|None, the default value of the flag.
746    enum_values: [str], a non-empty list of strings with the possible values for
747      the flag.
748    help: str, the help message.
749    flag_values: :class:`FlagValues`, the FlagValues instance with which the
750      flag will be registered. This should almost never need to be overridden.
751    module_name: str, the name of the Python module declaring this flag. If not
752      provided, it will be computed using the stack trace of this call.
753    required: bool, is this a required flag. This must be used as a keyword
754      argument.
755    **args: dict, the extra keyword args that are passed to ``Flag.__init__``.
756
757  Returns:
758    a handle to defined flag.
759  """
760  result = DEFINE_flag(
761      _flag.EnumFlag(name, default, help, enum_values, **args),
762      flag_values,
763      module_name,
764      required=True if required else False,
765  )
766  return result
767
768
769@overload
770def DEFINE_enum_class(  # pylint: disable=invalid-name
771    name: Text,
772    default: Union[None, _ET, Text],
773    enum_class: Type[_ET],
774    help: Optional[Text],  # pylint: disable=redefined-builtin
775    flag_values: _flagvalues.FlagValues = ...,
776    module_name: Optional[Text] = ...,
777    case_sensitive: bool = ...,
778    *,
779    required: 'typing.Literal[True]',
780    **args: Any
781) -> _flagvalues.FlagHolder[_ET]:
782  ...
783
784
785@overload
786def DEFINE_enum_class(  # pylint: disable=invalid-name
787    name: Text,
788    default: None,
789    enum_class: Type[_ET],
790    help: Optional[Text],  # pylint: disable=redefined-builtin
791    flag_values: _flagvalues.FlagValues = ...,
792    module_name: Optional[Text] = ...,
793    case_sensitive: bool = ...,
794    required: bool = ...,
795    **args: Any
796) -> _flagvalues.FlagHolder[Optional[_ET]]:
797  ...
798
799
800@overload
801def DEFINE_enum_class(  # pylint: disable=invalid-name
802    name: Text,
803    default: Union[_ET, Text],
804    enum_class: Type[_ET],
805    help: Optional[Text],  # pylint: disable=redefined-builtin
806    flag_values: _flagvalues.FlagValues = ...,
807    module_name: Optional[Text] = ...,
808    case_sensitive: bool = ...,
809    required: bool = ...,
810    **args: Any
811) -> _flagvalues.FlagHolder[_ET]:
812  ...
813
814
815def DEFINE_enum_class(  # pylint: disable=invalid-name,redefined-builtin
816    name,
817    default,
818    enum_class,
819    help,
820    flag_values=_flagvalues.FLAGS,
821    module_name=None,
822    case_sensitive=False,
823    required=False,
824    **args):
825  """Registers a flag whose value can be the name of enum members.
826
827  Args:
828    name: str, the flag name.
829    default: Enum|str|None, the default value of the flag.
830    enum_class: class, the Enum class with all the possible values for the flag.
831    help: str, the help message.
832    flag_values: :class:`FlagValues`, the FlagValues instance with which the
833      flag will be registered. This should almost never need to be overridden.
834    module_name: str, the name of the Python module declaring this flag. If not
835      provided, it will be computed using the stack trace of this call.
836    case_sensitive: bool, whether to map strings to members of the enum_class
837      without considering case.
838    required: bool, is this a required flag. This must be used as a keyword
839      argument.
840    **args: dict, the extra keyword args that are passed to ``Flag.__init__``.
841
842  Returns:
843    a handle to defined flag.
844  """
845  # NOTE: pytype fails if this is a direct return.
846  result = DEFINE_flag(
847      _flag.EnumClassFlag(
848          name, default, help, enum_class, case_sensitive=case_sensitive, **args
849      ),
850      flag_values,
851      module_name,
852      required=True if required else False,
853  )
854  return result
855
856
857@overload
858def DEFINE_list(  # pylint: disable=invalid-name
859    name: Text,
860    default: Union[None, Iterable[Text], Text],
861    help: Text,  # pylint: disable=redefined-builtin
862    flag_values: _flagvalues.FlagValues = ...,
863    *,
864    required: 'typing.Literal[True]',
865    **args: Any
866) -> _flagvalues.FlagHolder[List[Text]]:
867  ...
868
869
870@overload
871def DEFINE_list(  # pylint: disable=invalid-name
872    name: Text,
873    default: None,
874    help: Text,  # pylint: disable=redefined-builtin
875    flag_values: _flagvalues.FlagValues = ...,
876    required: bool = ...,
877    **args: Any
878) -> _flagvalues.FlagHolder[Optional[List[Text]]]:
879  ...
880
881
882@overload
883def DEFINE_list(  # pylint: disable=invalid-name
884    name: Text,
885    default: Union[Iterable[Text], Text],
886    help: Text,  # pylint: disable=redefined-builtin
887    flag_values: _flagvalues.FlagValues = ...,
888    required: bool = ...,
889    **args: Any
890) -> _flagvalues.FlagHolder[List[Text]]:
891  ...
892
893
894def DEFINE_list(  # pylint: disable=invalid-name,redefined-builtin
895    name,
896    default,
897    help,
898    flag_values=_flagvalues.FLAGS,
899    required=False,
900    **args):
901  """Registers a flag whose value is a comma-separated list of strings.
902
903  The flag value is parsed with a CSV parser.
904
905  Args:
906    name: str, the flag name.
907    default: list|str|None, the default value of the flag.
908    help: str, the help message.
909    flag_values: :class:`FlagValues`, the FlagValues instance with which the
910      flag will be registered. This should almost never need to be overridden.
911    required: bool, is this a required flag. This must be used as a keyword
912      argument.
913    **args: Dictionary with extra keyword args that are passed to the
914      ``Flag.__init__``.
915
916  Returns:
917    a handle to defined flag.
918  """
919  parser = _argument_parser.ListParser()
920  serializer = _argument_parser.CsvListSerializer(',')
921  return DEFINE(
922      parser,
923      name,
924      default,
925      help,
926      flag_values,
927      serializer,
928      required=True if required else False,
929      **args,
930  )
931
932
933@overload
934def DEFINE_spaceseplist(  # pylint: disable=invalid-name
935    name: Text,
936    default: Union[None, Iterable[Text], Text],
937    help: Text,  # pylint: disable=redefined-builtin
938    comma_compat: bool = ...,
939    flag_values: _flagvalues.FlagValues = ...,
940    *,
941    required: 'typing.Literal[True]',
942    **args: Any
943) -> _flagvalues.FlagHolder[List[Text]]:
944  ...
945
946
947@overload
948def DEFINE_spaceseplist(  # pylint: disable=invalid-name
949    name: Text,
950    default: None,
951    help: Text,  # pylint: disable=redefined-builtin
952    comma_compat: bool = ...,
953    flag_values: _flagvalues.FlagValues = ...,
954    required: bool = ...,
955    **args: Any
956) -> _flagvalues.FlagHolder[Optional[List[Text]]]:
957  ...
958
959
960@overload
961def DEFINE_spaceseplist(  # pylint: disable=invalid-name
962    name: Text,
963    default: Union[Iterable[Text], Text],
964    help: Text,  # pylint: disable=redefined-builtin
965    comma_compat: bool = ...,
966    flag_values: _flagvalues.FlagValues = ...,
967    required: bool = ...,
968    **args: Any
969) -> _flagvalues.FlagHolder[List[Text]]:
970  ...
971
972
973def DEFINE_spaceseplist(  # pylint: disable=invalid-name,redefined-builtin
974    name,
975    default,
976    help,
977    comma_compat=False,
978    flag_values=_flagvalues.FLAGS,
979    required=False,
980    **args):
981  """Registers a flag whose value is a whitespace-separated list of strings.
982
983  Any whitespace can be used as a separator.
984
985  Args:
986    name: str, the flag name.
987    default: list|str|None, the default value of the flag.
988    help: str, the help message.
989    comma_compat: bool - Whether to support comma as an additional separator. If
990      false then only whitespace is supported.  This is intended only for
991      backwards compatibility with flags that used to be comma-separated.
992    flag_values: :class:`FlagValues`, the FlagValues instance with which the
993      flag will be registered. This should almost never need to be overridden.
994    required: bool, is this a required flag. This must be used as a keyword
995      argument.
996    **args: Dictionary with extra keyword args that are passed to the
997      ``Flag.__init__``.
998
999  Returns:
1000    a handle to defined flag.
1001  """
1002  parser = _argument_parser.WhitespaceSeparatedListParser(
1003      comma_compat=comma_compat)
1004  serializer = _argument_parser.ListSerializer(' ')
1005  return DEFINE(
1006      parser,
1007      name,
1008      default,
1009      help,
1010      flag_values,
1011      serializer,
1012      required=True if required else False,
1013      **args,
1014  )
1015
1016
1017@overload
1018def DEFINE_multi(  # pylint: disable=invalid-name
1019    parser: _argument_parser.ArgumentParser[_T],
1020    serializer: _argument_parser.ArgumentSerializer[_T],
1021    name: Text,
1022    default: Iterable[_T],
1023    help: Text,  # pylint: disable=redefined-builtin
1024    flag_values: _flagvalues.FlagValues = ...,
1025    module_name: Optional[Text] = ...,
1026    *,
1027    required: 'typing.Literal[True]',
1028    **args: Any
1029) -> _flagvalues.FlagHolder[List[_T]]:
1030  ...
1031
1032
1033@overload
1034def DEFINE_multi(  # pylint: disable=invalid-name
1035    parser: _argument_parser.ArgumentParser[_T],
1036    serializer: _argument_parser.ArgumentSerializer[_T],
1037    name: Text,
1038    default: Union[None, _T],
1039    help: Text,  # pylint: disable=redefined-builtin
1040    flag_values: _flagvalues.FlagValues = ...,
1041    module_name: Optional[Text] = ...,
1042    *,
1043    required: 'typing.Literal[True]',
1044    **args: Any
1045) -> _flagvalues.FlagHolder[List[_T]]:
1046  ...
1047
1048
1049@overload
1050def DEFINE_multi(  # pylint: disable=invalid-name
1051    parser: _argument_parser.ArgumentParser[_T],
1052    serializer: _argument_parser.ArgumentSerializer[_T],
1053    name: Text,
1054    default: None,
1055    help: Text,  # pylint: disable=redefined-builtin
1056    flag_values: _flagvalues.FlagValues = ...,
1057    module_name: Optional[Text] = ...,
1058    required: bool = ...,
1059    **args: Any
1060) -> _flagvalues.FlagHolder[Optional[List[_T]]]:
1061  ...
1062
1063
1064@overload
1065def DEFINE_multi(  # pylint: disable=invalid-name
1066    parser: _argument_parser.ArgumentParser[_T],
1067    serializer: _argument_parser.ArgumentSerializer[_T],
1068    name: Text,
1069    default: Iterable[_T],
1070    help: Text,  # pylint: disable=redefined-builtin
1071    flag_values: _flagvalues.FlagValues = ...,
1072    module_name: Optional[Text] = ...,
1073    required: bool = ...,
1074    **args: Any
1075) -> _flagvalues.FlagHolder[List[_T]]:
1076  ...
1077
1078
1079@overload
1080def DEFINE_multi(  # pylint: disable=invalid-name
1081    parser: _argument_parser.ArgumentParser[_T],
1082    serializer: _argument_parser.ArgumentSerializer[_T],
1083    name: Text,
1084    default: _T,
1085    help: Text,  # pylint: disable=redefined-builtin
1086    flag_values: _flagvalues.FlagValues = ...,
1087    module_name: Optional[Text] = ...,
1088    required: bool = ...,
1089    **args: Any
1090) -> _flagvalues.FlagHolder[List[_T]]:
1091  ...
1092
1093
1094def DEFINE_multi(  # pylint: disable=invalid-name,redefined-builtin
1095    parser,
1096    serializer,
1097    name,
1098    default,
1099    help,
1100    flag_values=_flagvalues.FLAGS,
1101    module_name=None,
1102    required=False,
1103    **args):
1104  """Registers a generic MultiFlag that parses its args with a given parser.
1105
1106  Auxiliary function.  Normal users should NOT use it directly.
1107
1108  Developers who need to create their own 'Parser' classes for options
1109  which can appear multiple times can call this module function to
1110  register their flags.
1111
1112  Args:
1113    parser: ArgumentParser, used to parse the flag arguments.
1114    serializer: ArgumentSerializer, the flag serializer instance.
1115    name: str, the flag name.
1116    default: Union[Iterable[T], Text, None], the default value of the flag. If
1117      the value is text, it will be parsed as if it was provided from the
1118      command line. If the value is a non-string iterable, it will be iterated
1119      over to create a shallow copy of the values. If it is None, it is left
1120      as-is.
1121    help: str, the help message.
1122    flag_values: :class:`FlagValues`, the FlagValues instance with which the
1123      flag will be registered. This should almost never need to be overridden.
1124    module_name: A string, the name of the Python module declaring this flag. If
1125      not provided, it will be computed using the stack trace of this call.
1126    required: bool, is this a required flag. This must be used as a keyword
1127      argument.
1128    **args: Dictionary with extra keyword args that are passed to the
1129      ``Flag.__init__``.
1130
1131  Returns:
1132    a handle to defined flag.
1133  """
1134  result = DEFINE_flag(
1135      _flag.MultiFlag(parser, serializer, name, default, help, **args),
1136      flag_values,
1137      module_name,
1138      required=True if required else False,
1139  )
1140  return result
1141
1142
1143@overload
1144def DEFINE_multi_string(  # pylint: disable=invalid-name
1145    name: Text,
1146    default: Union[None, Iterable[Text], Text],
1147    help: Text,  # pylint: disable=redefined-builtin
1148    flag_values: _flagvalues.FlagValues = ...,
1149    *,
1150    required: 'typing.Literal[True]',
1151    **args: Any
1152) -> _flagvalues.FlagHolder[List[Text]]:
1153  ...
1154
1155
1156@overload
1157def DEFINE_multi_string(  # pylint: disable=invalid-name
1158    name: Text,
1159    default: None,
1160    help: Text,  # pylint: disable=redefined-builtin
1161    flag_values: _flagvalues.FlagValues = ...,
1162    required: bool = ...,
1163    **args: Any
1164) -> _flagvalues.FlagHolder[Optional[List[Text]]]:
1165  ...
1166
1167
1168@overload
1169def DEFINE_multi_string(  # pylint: disable=invalid-name
1170    name: Text,
1171    default: Union[Iterable[Text], Text],
1172    help: Text,  # pylint: disable=redefined-builtin
1173    flag_values: _flagvalues.FlagValues = ...,
1174    required: bool = ...,
1175    **args: Any
1176) -> _flagvalues.FlagHolder[List[Text]]:
1177  ...
1178
1179
1180def DEFINE_multi_string(  # pylint: disable=invalid-name,redefined-builtin
1181    name,
1182    default,
1183    help,
1184    flag_values=_flagvalues.FLAGS,
1185    required=False,
1186    **args):
1187  """Registers a flag whose value can be a list of any strings.
1188
1189  Use the flag on the command line multiple times to place multiple
1190  string values into the list.  The 'default' may be a single string
1191  (which will be converted into a single-element list) or a list of
1192  strings.
1193
1194
1195  Args:
1196    name: str, the flag name.
1197    default: Union[Iterable[Text], Text, None], the default value of the flag;
1198      see :func:`DEFINE_multi`.
1199    help: str, the help message.
1200    flag_values: :class:`FlagValues`, the FlagValues instance with which the
1201      flag will be registered. This should almost never need to be overridden.
1202    required: bool, is this a required flag. This must be used as a keyword
1203      argument.
1204    **args: Dictionary with extra keyword args that are passed to the
1205      ``Flag.__init__``.
1206
1207  Returns:
1208    a handle to defined flag.
1209  """
1210  parser = _argument_parser.ArgumentParser()
1211  serializer = _argument_parser.ArgumentSerializer()
1212  return DEFINE_multi(
1213      parser,
1214      serializer,
1215      name,
1216      default,
1217      help,
1218      flag_values,
1219      required=True if required else False,
1220      **args,
1221  )
1222
1223
1224@overload
1225def DEFINE_multi_integer(  # pylint: disable=invalid-name
1226    name: Text,
1227    default: Union[None, Iterable[int], int, Text],
1228    help: Text,  # pylint: disable=redefined-builtin
1229    lower_bound: Optional[int] = ...,
1230    upper_bound: Optional[int] = ...,
1231    flag_values: _flagvalues.FlagValues = ...,
1232    *,
1233    required: 'typing.Literal[True]',
1234    **args: Any
1235) -> _flagvalues.FlagHolder[List[int]]:
1236  ...
1237
1238
1239@overload
1240def DEFINE_multi_integer(  # pylint: disable=invalid-name
1241    name: Text,
1242    default: None,
1243    help: Text,  # pylint: disable=redefined-builtin
1244    lower_bound: Optional[int] = ...,
1245    upper_bound: Optional[int] = ...,
1246    flag_values: _flagvalues.FlagValues = ...,
1247    required: bool = ...,
1248    **args: Any
1249) -> _flagvalues.FlagHolder[Optional[List[int]]]:
1250  ...
1251
1252
1253@overload
1254def DEFINE_multi_integer(  # pylint: disable=invalid-name
1255    name: Text,
1256    default: Union[Iterable[int], int, Text],
1257    help: Text,  # pylint: disable=redefined-builtin
1258    lower_bound: Optional[int] = ...,
1259    upper_bound: Optional[int] = ...,
1260    flag_values: _flagvalues.FlagValues = ...,
1261    required: bool = ...,
1262    **args: Any
1263) -> _flagvalues.FlagHolder[List[int]]:
1264  ...
1265
1266
1267def DEFINE_multi_integer(  # pylint: disable=invalid-name,redefined-builtin
1268    name,
1269    default,
1270    help,
1271    lower_bound=None,
1272    upper_bound=None,
1273    flag_values=_flagvalues.FLAGS,
1274    required=False,
1275    **args):
1276  """Registers a flag whose value can be a list of arbitrary integers.
1277
1278  Use the flag on the command line multiple times to place multiple
1279  integer values into the list.  The 'default' may be a single integer
1280  (which will be converted into a single-element list) or a list of
1281  integers.
1282
1283  Args:
1284    name: str, the flag name.
1285    default: Union[Iterable[int], Text, None], the default value of the flag;
1286      see `DEFINE_multi`.
1287    help: str, the help message.
1288    lower_bound: int, min values of the flag.
1289    upper_bound: int, max values of the flag.
1290    flag_values: :class:`FlagValues`, the FlagValues instance with which the
1291      flag will be registered. This should almost never need to be overridden.
1292    required: bool, is this a required flag. This must be used as a keyword
1293      argument.
1294    **args: Dictionary with extra keyword args that are passed to the
1295      ``Flag.__init__``.
1296
1297  Returns:
1298    a handle to defined flag.
1299  """
1300  parser = _argument_parser.IntegerParser(lower_bound, upper_bound)
1301  serializer = _argument_parser.ArgumentSerializer()
1302  return DEFINE_multi(
1303      parser,
1304      serializer,
1305      name,
1306      default,
1307      help,
1308      flag_values,
1309      required=True if required else False,
1310      **args,
1311  )
1312
1313
1314@overload
1315def DEFINE_multi_float(  # pylint: disable=invalid-name
1316    name: Text,
1317    default: Union[None, Iterable[float], float, Text],
1318    help: Text,  # pylint: disable=redefined-builtin
1319    lower_bound: Optional[float] = ...,
1320    upper_bound: Optional[float] = ...,
1321    flag_values: _flagvalues.FlagValues = ...,
1322    *,
1323    required: 'typing.Literal[True]',
1324    **args: Any
1325) -> _flagvalues.FlagHolder[List[float]]:
1326  ...
1327
1328
1329@overload
1330def DEFINE_multi_float(  # pylint: disable=invalid-name
1331    name: Text,
1332    default: None,
1333    help: Text,  # pylint: disable=redefined-builtin
1334    lower_bound: Optional[float] = ...,
1335    upper_bound: Optional[float] = ...,
1336    flag_values: _flagvalues.FlagValues = ...,
1337    required: bool = ...,
1338    **args: Any
1339) -> _flagvalues.FlagHolder[Optional[List[float]]]:
1340  ...
1341
1342
1343@overload
1344def DEFINE_multi_float(  # pylint: disable=invalid-name
1345    name: Text,
1346    default: Union[Iterable[float], float, Text],
1347    help: Text,  # pylint: disable=redefined-builtin
1348    lower_bound: Optional[float] = ...,
1349    upper_bound: Optional[float] = ...,
1350    flag_values: _flagvalues.FlagValues = ...,
1351    required: bool = ...,
1352    **args: Any
1353) -> _flagvalues.FlagHolder[List[float]]:
1354  ...
1355
1356
1357def DEFINE_multi_float(  # pylint: disable=invalid-name,redefined-builtin
1358    name,
1359    default,
1360    help,
1361    lower_bound=None,
1362    upper_bound=None,
1363    flag_values=_flagvalues.FLAGS,
1364    required=False,
1365    **args):
1366  """Registers a flag whose value can be a list of arbitrary floats.
1367
1368  Use the flag on the command line multiple times to place multiple
1369  float values into the list.  The 'default' may be a single float
1370  (which will be converted into a single-element list) or a list of
1371  floats.
1372
1373  Args:
1374    name: str, the flag name.
1375    default: Union[Iterable[float], Text, None], the default value of the flag;
1376      see `DEFINE_multi`.
1377    help: str, the help message.
1378    lower_bound: float, min values of the flag.
1379    upper_bound: float, max values of the flag.
1380    flag_values: :class:`FlagValues`, the FlagValues instance with which the
1381      flag will be registered. This should almost never need to be overridden.
1382    required: bool, is this a required flag. This must be used as a keyword
1383      argument.
1384    **args: Dictionary with extra keyword args that are passed to the
1385      ``Flag.__init__``.
1386
1387  Returns:
1388    a handle to defined flag.
1389  """
1390  parser = _argument_parser.FloatParser(lower_bound, upper_bound)
1391  serializer = _argument_parser.ArgumentSerializer()
1392  return DEFINE_multi(
1393      parser,
1394      serializer,
1395      name,
1396      default,
1397      help,
1398      flag_values,
1399      required=True if required else False,
1400      **args,
1401  )
1402
1403
1404@overload
1405def DEFINE_multi_enum(  # pylint: disable=invalid-name
1406    name: Text,
1407    default: Union[None, Iterable[Text], Text],
1408    enum_values: Iterable[Text],
1409    help: Text,  # pylint: disable=redefined-builtin
1410    flag_values: _flagvalues.FlagValues = ...,
1411    *,
1412    required: 'typing.Literal[True]',
1413    **args: Any
1414) -> _flagvalues.FlagHolder[List[Text]]:
1415  ...
1416
1417
1418@overload
1419def DEFINE_multi_enum(  # pylint: disable=invalid-name
1420    name: Text,
1421    default: None,
1422    enum_values: Iterable[Text],
1423    help: Text,  # pylint: disable=redefined-builtin
1424    flag_values: _flagvalues.FlagValues = ...,
1425    required: bool = ...,
1426    **args: Any
1427) -> _flagvalues.FlagHolder[Optional[List[Text]]]:
1428  ...
1429
1430
1431@overload
1432def DEFINE_multi_enum(  # pylint: disable=invalid-name
1433    name: Text,
1434    default: Union[Iterable[Text], Text],
1435    enum_values: Iterable[Text],
1436    help: Text,  # pylint: disable=redefined-builtin
1437    flag_values: _flagvalues.FlagValues = ...,
1438    required: bool = ...,
1439    **args: Any
1440) -> _flagvalues.FlagHolder[List[Text]]:
1441  ...
1442
1443
1444def DEFINE_multi_enum(  # pylint: disable=invalid-name,redefined-builtin
1445    name,
1446    default,
1447    enum_values,
1448    help,
1449    flag_values=_flagvalues.FLAGS,
1450    case_sensitive=True,
1451    required=False,
1452    **args):
1453  """Registers a flag whose value can be a list strings from enum_values.
1454
1455  Use the flag on the command line multiple times to place multiple
1456  enum values into the list.  The 'default' may be a single string
1457  (which will be converted into a single-element list) or a list of
1458  strings.
1459
1460  Args:
1461    name: str, the flag name.
1462    default: Union[Iterable[Text], Text, None], the default value of the flag;
1463      see `DEFINE_multi`.
1464    enum_values: [str], a non-empty list of strings with the possible values for
1465      the flag.
1466    help: str, the help message.
1467    flag_values: :class:`FlagValues`, the FlagValues instance with which the
1468      flag will be registered. This should almost never need to be overridden.
1469    case_sensitive: Whether or not the enum is to be case-sensitive.
1470    required: bool, is this a required flag. This must be used as a keyword
1471      argument.
1472    **args: Dictionary with extra keyword args that are passed to the
1473      ``Flag.__init__``.
1474
1475  Returns:
1476    a handle to defined flag.
1477  """
1478  parser = _argument_parser.EnumParser(enum_values, case_sensitive)
1479  serializer = _argument_parser.ArgumentSerializer()
1480  return DEFINE_multi(
1481      parser,
1482      serializer,
1483      name,
1484      default,
1485      '<%s>: %s' % ('|'.join(enum_values), help),
1486      flag_values,
1487      required=True if required else False,
1488      **args,
1489  )
1490
1491
1492@overload
1493def DEFINE_multi_enum_class(  # pylint: disable=invalid-name
1494    name: Text,
1495    # This is separate from `Union[None, _ET, Iterable[Text], Text]` to avoid a
1496    # Pytype issue inferring the return value to
1497    # FlagHolder[List[Union[_ET, enum.Enum]]] when an iterable of concrete enum
1498    # subclasses are used.
1499    default: Iterable[_ET],
1500    enum_class: Type[_ET],
1501    help: Text,  # pylint: disable=redefined-builtin
1502    flag_values: _flagvalues.FlagValues = ...,
1503    module_name: Optional[Text] = ...,
1504    *,
1505    required: 'typing.Literal[True]',
1506    **args: Any
1507) -> _flagvalues.FlagHolder[List[_ET]]:
1508  ...
1509
1510
1511@overload
1512def DEFINE_multi_enum_class(  # pylint: disable=invalid-name
1513    name: Text,
1514    default: Union[None, _ET, Iterable[Text], Text],
1515    enum_class: Type[_ET],
1516    help: Text,  # pylint: disable=redefined-builtin
1517    flag_values: _flagvalues.FlagValues = ...,
1518    module_name: Optional[Text] = ...,
1519    *,
1520    required: 'typing.Literal[True]',
1521    **args: Any
1522) -> _flagvalues.FlagHolder[List[_ET]]:
1523  ...
1524
1525
1526@overload
1527def DEFINE_multi_enum_class(  # pylint: disable=invalid-name
1528    name: Text,
1529    default: None,
1530    enum_class: Type[_ET],
1531    help: Text,  # pylint: disable=redefined-builtin
1532    flag_values: _flagvalues.FlagValues = ...,
1533    module_name: Optional[Text] = ...,
1534    required: bool = ...,
1535    **args: Any
1536) -> _flagvalues.FlagHolder[Optional[List[_ET]]]:
1537  ...
1538
1539
1540@overload
1541def DEFINE_multi_enum_class(  # pylint: disable=invalid-name
1542    name: Text,
1543    # This is separate from `Union[None, _ET, Iterable[Text], Text]` to avoid a
1544    # Pytype issue inferring the return value to
1545    # FlagHolder[List[Union[_ET, enum.Enum]]] when an iterable of concrete enum
1546    # subclasses are used.
1547    default: Iterable[_ET],
1548    enum_class: Type[_ET],
1549    help: Text,  # pylint: disable=redefined-builtin
1550    flag_values: _flagvalues.FlagValues = ...,
1551    module_name: Optional[Text] = ...,
1552    required: bool = ...,
1553    **args: Any
1554) -> _flagvalues.FlagHolder[List[_ET]]:
1555  ...
1556
1557
1558@overload
1559def DEFINE_multi_enum_class(  # pylint: disable=invalid-name
1560    name: Text,
1561    default: Union[_ET, Iterable[Text], Text],
1562    enum_class: Type[_ET],
1563    help: Text,  # pylint: disable=redefined-builtin
1564    flag_values: _flagvalues.FlagValues = ...,
1565    module_name: Optional[Text] = ...,
1566    required: bool = ...,
1567    **args: Any
1568) -> _flagvalues.FlagHolder[List[_ET]]:
1569  ...
1570
1571
1572def DEFINE_multi_enum_class(  # pylint: disable=invalid-name,redefined-builtin
1573    name,
1574    default,
1575    enum_class,
1576    help,
1577    flag_values=_flagvalues.FLAGS,
1578    module_name=None,
1579    case_sensitive=False,
1580    required=False,
1581    **args):
1582  """Registers a flag whose value can be a list of enum members.
1583
1584  Use the flag on the command line multiple times to place multiple
1585  enum values into the list.
1586
1587  Args:
1588    name: str, the flag name.
1589    default: Union[Iterable[Enum], Iterable[Text], Enum, Text, None], the
1590      default value of the flag; see `DEFINE_multi`; only differences are
1591      documented here. If the value is a single Enum, it is treated as a
1592      single-item list of that Enum value. If it is an iterable, text values
1593      within the iterable will be converted to the equivalent Enum objects.
1594    enum_class: class, the Enum class with all the possible values for the flag.
1595        help: str, the help message.
1596    flag_values: :class:`FlagValues`, the FlagValues instance with which the
1597      flag will be registered. This should almost never need to be overridden.
1598    module_name: A string, the name of the Python module declaring this flag. If
1599      not provided, it will be computed using the stack trace of this call.
1600    case_sensitive: bool, whether to map strings to members of the enum_class
1601      without considering case.
1602    required: bool, is this a required flag. This must be used as a keyword
1603      argument.
1604    **args: Dictionary with extra keyword args that are passed to the
1605      ``Flag.__init__``.
1606
1607  Returns:
1608    a handle to defined flag.
1609  """
1610  # NOTE: pytype fails if this is a direct return.
1611  result = DEFINE_flag(
1612      _flag.MultiEnumClassFlag(
1613          name,
1614          default,
1615          help,
1616          enum_class,
1617          case_sensitive=case_sensitive,
1618          **args,
1619      ),
1620      flag_values,
1621      module_name,
1622      required=True if required else False,
1623  )
1624  return result
1625
1626
1627def DEFINE_alias(  # pylint: disable=invalid-name
1628    name: Text,
1629    original_name: Text,
1630    flag_values: _flagvalues.FlagValues = _flagvalues.FLAGS,
1631    module_name: Optional[Text] = None,
1632) -> _flagvalues.FlagHolder[Any]:
1633  """Defines an alias flag for an existing one.
1634
1635  Args:
1636    name: str, the flag name.
1637    original_name: str, the original flag name.
1638    flag_values: :class:`FlagValues`, the FlagValues instance with which the
1639      flag will be registered. This should almost never need to be overridden.
1640    module_name: A string, the name of the module that defines this flag.
1641
1642  Returns:
1643    a handle to defined flag.
1644
1645  Raises:
1646    flags.FlagError:
1647      UnrecognizedFlagError: if the referenced flag doesn't exist.
1648      DuplicateFlagError: if the alias name has been used by some existing flag.
1649  """
1650  if original_name not in flag_values:
1651    raise _exceptions.UnrecognizedFlagError(original_name)
1652  flag = flag_values[original_name]
1653
1654  class _FlagAlias(_flag.Flag):
1655    """Overrides Flag class so alias value is copy of original flag value."""
1656
1657    def parse(self, argument):
1658      flag.parse(argument)
1659      self.present += 1
1660
1661    def _parse_from_default(self, value):
1662      # The value was already parsed by the aliased flag, so there is no
1663      # need to call the parser on it a second time.
1664      # Additionally, because of how MultiFlag parses and merges values,
1665      # it isn't possible to delegate to the aliased flag and still get
1666      # the correct values.
1667      return value
1668
1669    @property
1670    def value(self):
1671      return flag.value
1672
1673    @value.setter
1674    def value(self, value):
1675      flag.value = value
1676
1677  help_msg = 'Alias for --%s.' % flag.name
1678  # If alias_name has been used, flags.DuplicatedFlag will be raised.
1679  return DEFINE_flag(
1680      _FlagAlias(
1681          flag.parser,
1682          flag.serializer,
1683          name,
1684          flag.default,
1685          help_msg,
1686          boolean=flag.boolean), flag_values, module_name)
1687