Аргумент 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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