Аргумент argparse как позиционный, так и именованныйPython

Программы на Python
Anonymous
Аргумент argparse как позиционный, так и именованный

Сообщение Anonymous »

Я хочу воссоздать поведение grep, где шаблон может быть задан как в виде позиционного, так и в виде именованного аргумента:

Код: Выделить всё

In : parser.parse_args(['x', 'a', 'b'])
Out: Namespace(pattern=['x'], files=['a', 'b'])
In : parser.parse_args(['-e', 'x', 'a', 'b'])
Out: Namespace(pattern=['x'], files=['a', 'b'])
In : parser.parse_args(['-e', 'x', '-e', 'y', 'a', 'b'])
Out: Namespace(pattern=['x', 'y'], files=['a', 'b'])
То есть, -e может быть задан несколько раз, принимая по одному значению каждый раз, но если он не задан вообще, то вместо этого значение берется из первого позиционного аргумента. Остальные позиционные значения хранятся в отдельном списке.
Я попробовал выполнить parser.add_argument('pattern', '-e', '--pattern'), но получил шаблон ошибки, который должен начинаться с '-', который я прочитал, поскольку аргумент не может быть одновременно позиционным и именованным.
Я мог бы сделать:

Код: Выделить всё

parser.add_argument('-e', '--pattern', action='append')
parser.add_argument('positional', nargs='+')
args = parser.parse_args()
patterns = args.pattern or args.positional[0]
files = args.positional[(not args.pattern):]
assert len(files)
Но тогда сгенерированное использование и справка не соответствуют логике программы.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -and-named

Вернуться в «Python»