ConfigArgParse icon indicating copy to clipboard operation
ConfigArgParse copied to clipboard

"# normalize args by converting args like --key=value to --key value" breaks "--key=-value"

Open EvanED opened this issue 7 years ago • 1 comments

This is a discrepancy between configargparse and argparse.

Suppose I want to pass an argument to an option where the argument starts with a hyphen. This works with argparse:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--stuff')
>>> args = parser.parse_args(['--stuff=--thing'])
>>> args.stuff
'--thing'

but the normalization step breaks this for configargparse:

>>> import configargparse
>>> parser = configargparse.ArgumentParser()
>>> parser.add_argument('--stuff')
>>> args = parser.parse_args(["--stuff=--thing"])
usage: [-h] [--stuff STUFF]
: error: argument --stuff: expected one argument

The reason this breaks is because of Python bug #9334, which will prevent arguments to an option as parsing as such when they have a leading hyphen. (Yes, this is contrary to every other argument parsing library ever written, including getopt_long.)

Is this normalization step required?

EvanED avatar Nov 30 '17 00:11 EvanED

Yeah, it's needed for the already_on_command_line(existing_args_list, potential_command_line_args) check to work - which is a key step in handling args that are for example specified in both on the command-line and in a config file: https://github.com/bw2/ConfigArgParse/blob/master/configargparse.py#L892

The fix is probably to have 2 separate lists - the args list that's being built up, and a separate list of previously-seen keys. I don't have time to implement this unfortunately.

bw2 avatar Dec 26 '17 19:12 bw2