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