简体   繁体   中英

add_subparsers doesn't identify sub_argument

I'm trying to build a script that uses subparsers arguments. However, I can not pass any of the sub-arguments as a parameter. Resulting in "invalid choice:" for any input combination.

Example input:

python3 preprocess.py -d ../data/acm/ tf -l en

Complete Output:

usage: preprocess.py [-h] [-k FOLDS] -d DATASETDIR [DATASETDIR ...] {tf} ...
preprocess.py: error: invalid choice: 'en' (choose from 'tf')

The code is

parser = argparse.ArgumentParser(description='Split input dataset into k folds of cross-validation.')

parser.add_argument('-k', '--folds', default=10, help='Number of folds for K fold cross-validation.', type=int)

required_args = parser.add_argument_group('required arguments')
required_args.add_argument('-d','--datasetdir', type=str, nargs='+', help='Dataset path (For more info: readme.txt)', required=True)

parser_subparsers = parser.add_subparsers(title="Representations", description="Choose the representations")
parser_tf = parser_subparsers.add_parser('tf', help='TF helper')
parser_tf.add_argument('-l', '--language', type=str, help='Language', default='en', choices=['en'])
parser_tf.add_argument('-s', '--stopword', type=bool, help='Skip stopwords', default=True)

args = parser.parse_args()

Since --datasetdir has nargs="+" the other argument(s) are being slurped up as additional dataset dir, rather than invoking the subparser.

CLI suggestion: change datasetdir into a plain old positional argument, with ability to separate paths using os.pathsep . It will be difficult to wrangle argparse into what you wanted to do, and using optional arguments with required=True is a code smell in the first place.

New interface will look something like this:

python3 preprocess.py ../data/acm/:/dir2:/dir3 tf -l en

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM