add_subparsers не идентифицирует sub_argument - PullRequest
1 голос
/ 18 марта 2019

Я пытаюсь создать скрипт, который использует аргументы подпарсеров.Однако я не могу передать ни один из под-аргументов в качестве параметра.В результате «неверный выбор:» для любой входной комбинации.

Пример ввода:

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

Полный вывод:

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

Код

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()

1 Ответ

2 голосов
/ 18 марта 2019

Поскольку --datasetdir имеет nargs="+", другие аргументы (s) отбрасываются как дополнительный набор данных dir, а не вызывают подпарсер.

Рекомендация CLI: замените datasetdir на простой старый позиционный аргумент, с возможностью разделения путей, используя os.pathsep. Трудно будет втиснуть argparse в то, что вы хотели сделать, и использование необязательных аргументов с required=True - это, прежде всего, запах кода.

Новый интерфейс будет выглядеть примерно так:

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