argparse направляет позиционные аргументы в несколько списков - PullRequest
0 голосов
/ 12 октября 2018

Я хотел бы иметь возможность поддерживать позиционные аргументы командной строки, которые входят в разные списки на основе предыдущих предикатов.

Например, такая команда:

mycommand one two three

будет выдавать аргументыкак:

main_dest = ['one','two','three']
other_dest = []

но команда вроде:

mycommand one --other two three --main four five

выдаст аргументы типа:

main_dest = ['one','four','five']
other_dest = ['two','three']

Концептуально, что я хотел бы, это действие, которое изменяетdest считывателя позиционных аргументов.

1 Ответ

0 голосов
/ 12 октября 2018

В качестве первой попытки этот набор действий, кажется, делает свое дело:

In [73]: parser = argparse.ArgumentParser()
In [74]: parser.add_argument('main', nargs='*');
In [75]: parser.add_argument('other', nargs='*');
In [76]: parser.add_argument('--main', action='append');
In [77]: parser.add_argument('--other', action='append');

In [78]: parser.print_usage()
usage: ipython3 [-h] [--main MAIN] [--other OTHER]
                [main [main ...]] [other [other ...]]

In [79]: parser.parse_args('one two three'.split())
Out[79]: Namespace(main=['one', 'two', 'three'], other=[])

In [80]: parser.parse_args('one --other two --main three'.split())
Out[80]: Namespace(main=['one', 'three'], other=['two'])

74 и 76 оба имеют main в качестве dest.Я использую append для помеченных, чтобы они не перезаписывали позиционные значения.Но, несмотря на то, что показывает usage, позиционеры будут работать только на старте.Если поставить конец, они будут перезаписывать помеченные значения.И «другое» позиционное положение никогда не получит значений, поэтому я должен был его опустить.

Так что можно играть в подобные игры, но я не уверен, что он надежен или проще для ваших пользователей.

argparse: сгладить результат действия = 'append'

...