B @`6@sdZddlmZddlmZddlmZddlZddlZddlmZe ddd d d d hZ Gd ddej Z Gdddej Z Gdddej ZGdddej ZddZddZdS)a This module provides argparse integration with absl.flags. argparse_flags.ArgumentParser is a drop-in replacement for argparse.ArgumentParser. It takes care of collecting and defining absl flags in argparse. Here is a simple example: # Assume the following absl.flags is defined in another module: # # from absl import flags # flags.DEFINE_string('echo', None, 'The echo message.') # parser = argparse_flags.ArgumentParser( description='A demo of absl.flags and argparse integration.') parser.add_argument('--header', help='Header message to print.') # The parser will also accept the absl flag `--echo`. # The `header` value is available as `args.header` just like a regular # argparse flag. The absl flag `--echo` continues to be available via # `absl.flags.FLAGS` if you want to access it. args = parser.parse_args() # Example usages: # ./program --echo='A message.' --header='A header' # ./program --header 'A header' --echo 'A message.' Here is another example demonstrates subparsers: parser = argparse_flags.ArgumentParser(description='A subcommands demo.') parser.add_argument('--header', help='The header message to print.') subparsers = parser.add_subparsers(help='The command to execute.') roll_dice_parser = subparsers.add_parser( 'roll_dice', help='Roll a dice.', # By default, absl flags can also be specified after the sub-command. # To only allow them before sub-command, pass # `inherited_absl_flags=None`. inherited_absl_flags=None) roll_dice_parser.add_argument('--num_faces', type=int, default=6) roll_dice_parser.set_defaults(command=roll_dice) shuffle_parser = subparsers.add_parser('shuffle', help='Shuffle inputs.') shuffle_parser.add_argument( 'inputs', metavar='I', nargs='+', help='Inputs to shuffle.') shuffle_parser.set_defaults(command=shuffle) args = parser.parse_args(argv[1:]) args.command(args) # Example usages: # ./program --echo='A message.' roll_dice --num_faces=6 # ./program shuffle --echo='A message.' 1 2 3 4 There are several differences between absl.flags and argparse_flags: 1. Flags defined with absl.flags are parsed differently when using the argparse parser. Notably: 1) absl.flags allows both single-dash and double-dash for any flag, and doesn't distinguish them; argparse_flags only allows double-dash for flag's regular name, and single-dash for flag's `short_name`. 2) Boolean flags in absl.flags can be specified with `--bool`, `--nobool`, as well as `--bool=true/false` (though not recommended); in argparse_flags, it only allows `--bool`, `--nobool`. 2. Help related flag differences: 1) absl.flags does not define help flags, absl.app does that; argparse_flags defines help flags unless passed with `add_help=False`. 2) absl.app supports `--helpxml`; argparse_flags does not. 3) argparse_flags supports `-h`; absl.app does not. )absolute_import)division)print_functionN)flagshelpZ helpshortZhelpfullZhelpxmlZflagfileundefokcs>eZdZdZfddZd fdd ZddZd d ZZS) ArgumentParserz:Custom ArgumentParser class to support special absl flags.c s|dd}|dkr"td||dtj|_tt|j f||j rt|j ddt j t j d|j dtt j d d|jr|j d t j d ||jd S) aInitializes ArgumentParser. Args: **kwargs: same as argparse.ArgumentParser, except: 1. It also accepts `inherited_absl_flags`: the absl flags to inherit. The default is the global absl.flags.FLAGS instance. Pass None to ignore absl flags. 2. The `prefix_chars` argument must be the default value '-'. Raises: ValueError: Raised when prefix_chars is not '-'. prefix_chars-zTargparse_flags.ArgumentParser only supports "-" as the prefix character, found "{}".Zinherited_absl_flagsz --helpshortr)actiondefaultrz --helpfullzshow full help message and exitz --undefok)rN)get ValueErrorformatpoprFLAGS_inherited_absl_flagssuperr__init__add_help add_argumentargparseSUPPRESS_HelpFullAction_define_absl_flags)selfkwargsr ) __class__=/tmp/pip-unpacked-wheel-01biqzia/absl/flags/argparse_flags.pyrss"  zArgumentParser.__init__Nc s|dkrtjdd}|jr,|jj|dd}t}t|d|}tt|||\}}||k rb||_ |jrt |drt |j |}|` |j y|j Wn2tjk r}z|t|Wdd}~XYnX||fS)NT)Z force_gnur)sysargvrZread_flags_from_filesobjectgetattrrrparse_known_argsrhasattr_strip_undefok_argsZmark_as_parsedZvalidate_all_flagsrZIllegalFlagValueErrorerrorstr)rargs namespaceZundefok_missingre)rrrr%s*        zArgumentParser.parse_known_argscCsVt|tjd}x<|D]4}|tkr(q||}||jkr||k}|||qWdS)zDefines flags from absl_flags.rN)setZget_key_flags_for_moduler!r"_BUILT_IN_FLAGSname_define_absl_flag)r absl_flagsZ key_flagsr/ flag_instancesuppressrrrrs  z!ArgumentParser._define_absl_flagscCs|j}|j}d|g}|r*|dd||r6tj}n|jdd}|jrv|d||j |t ||j |dn|j |t ||j |ddS) z&Defines a flag from the flag_instance.z--rr %z%%z--no)r rmetavarr2N) r/ short_nameinsertrrrreplacebooleanappendr_BooleanFlagActionupper _FlagAction)rr2r3Z flag_namer6Zargument_namesZhelptextrrrr0s$  z ArgumentParser._define_absl_flag)NN) __name__ __module__ __qualname____doc__rr%rr0 __classcell__rr)rrrps  ()rcs*eZdZdZfddZdddZZS)r=z*Action class for Abseil non-boolean flags.cs&~||_tt|j|tj||ddS)a#Initializes _FlagAction. Args: option_strings: See argparse.Action. dest: Ignored. The flag is always defined with dest=argparse.SUPPRESS. help: See argparse.Action. metavar: See argparse.Action. flag_instance: absl.flags.Flag, the absl flag instance. )option_stringsdestrr5N)_flag_instancerr=rrr)rrCrDrr5r2)rrrrs  z_FlagAction.__init__NcCs|j|d|j_dS)zCSee https://docs.python.org/3/library/argparse.html#action-classes.FN)rEparseusing_default_value)rparserr+values option_stringrrr__call__s z_FlagAction.__call__)N)r>r?r@rArrKrBrr)rrr=s r=cs*eZdZdZfddZdddZZS)r;z&Action class for Abseil boolean flags.csR~||_|jjg}|jjr(||jjt||_tt|j|t j d||ddS)a*Initializes _BooleanFlagAction. Args: option_strings: See argparse.Action. dest: Ignored. The flag is always defined with dest=argparse.SUPPRESS. help: See argparse.Action. metavar: See argparse.Action. flag_instance: absl.flags.Flag, the absl flag instance. r)rCrDnargsrr5N) rEr/r6r: frozenset _flag_namesrr;rrr)rrCrDrr5r2Z flag_names)rrrr s    z_BooleanFlagAction.__init__NcCst|tr|rtd|dr.|dd}n |dd}||jkrR|jdn4|drn|dd|jkrztd||jd d |j_dS) zCSee https://docs.python.org/3/library/argparse.html#action-classes.zvalues must be an empty list.z--Nr truenozinvalid option_string: falseF) isinstancelistr startswithrNrErFrG)rrHr+rIrJoptionrrrrK#s     z_BooleanFlagAction.__call__)N)r>r?r@rArrKrBrr)rrr; s r;cs*eZdZdZfddZdddZZS)rz!Action class for --helpfull flag.cs&~~tt|j|tjtjd|ddS)zInitializes _HelpFullAction. Args: option_strings: See argparse.Action. dest: Ignored. The flag is always defined with dest=argparse.SUPPRESS. default: Ignored. help: See argparse.Action. r)rCrDr rLrN)rrrrr)rrCrDr r)rrrr7s  z_HelpFullAction.__init__NcCsZ||j}|rNt|}tjd}||kr:||t|j|ddd| dS)zCSee https://docs.python.org/3/library/argparse.html#action-classes.rT)prefixZinclude_special_flagsN) print_helprsortedZflags_by_module_dictr!r"removeprintZ_get_help_for_modulesexit)rrHr+rIrJr1modulesZ main_modulerrrrKHs   z_HelpFullAction.__call__)N)r>r?r@rArrKrBrr)rrr4s rcsH|rDtdd|dDtddDOfdd|D}|S)z=Returns a new list of args after removing flags in --undefok.css|]}|VqdS)N)strip).0r/rrr _sz&_strip_undefok_args..,css|]}d|VqdS)rQNr)r`r/rrrra`scsg|]}t|s|qSr) _is_undefok)r`arg) undefok_namesrr bsz'_strip_undefok_args..)r-split)rr*r)rerr'\s r'cCs`|dsdS|dr&|dd}n |dd}d|krL|dd\}}n|}||kr\dSdS) zGReturns whether we can ignore arg based on a set of undefok flag names.r Fz--rONr =T)rUrg)rdreZarg_without_dashr/_rrrrcfs   rc)rA __future__rrrrr!ZabslrrMr.rActionr=r;rr'rcrrrrZs&    ~+(