--
это удобный способ сказать «позиционные аргументы начинаются здесь ».
С вашим анализатором, эти работы:
program.py refresh # sets ids=None
program.py refresh --ids 1 2 3
program.py --ids 1 2 3 -- refresh
Вы могли бы дать --ids
аргумента по умолчанию (например, []), если вы не любите None
.
Любые проблемы с program.py refesh --ids 1,2,3
связаны с тем, как оболочка разбивает вашу командную строку. Посмотрите список sys.argv
.
Проблемы с program.py --ids 1 2 3 refresh
возникают из-за того, что при обработке --ids
анализатор пытается использовать все последующие строки, которые не являются явно флагами (например, с «-»). Он не использует тип «int» для проверки того, какие из них использовать и которые нужно оставить.
Теперь, если ids
были позиционными, он будет обрабатывать 1 2 3 refresh
:
parser.add_argument('ids',type=int,nargs='+')
parser.add_argument('cmd')
parser.parse_args('1 2 3 refresh'.split())
Но это потому, что анализатор использует различные стратегии для выделения строк до нескольких позиционных аргументов. Он использует совпадение re
, которое выглядит как A+A
.
type
подход Кевина может быть лучше реализован с помощью простой функции:
def mytype(astring):
ll = astring.split(',')
return [int(l) for l in ll]
parser.add_argument('--ids', type=mytype)
Это может быть обобщена для обработки строки в кавычках, как «1 2 3». type
может быть любой функцией, которая берет строку и возвращает требуемые значения, и вызывает ошибку, если она не может выполнить преобразование.
Вы можете разобрать строку сразу, а не позже, передав произвольное имя в качестве 'type'. – Kevin
@Kevin a la the ['perfect_square'] (https://docs.python.org/3/library/argparse.html#type) пример? – Michael
Да, точно.Вы можете использовать что-то вроде '' operator.methodcaller ('split', ',') '] (https://docs.python.org/3/library/operator.html#operator.methodcaller) как ваш' type', автоматически разбивать запятые. – Kevin