Дополнительные позиционные аргументы с аргументом Python

Andreas Matthias спросил: 13 июня 2018 в 07:54 в: python

Попытка разобрать необязательные позиционные аргументы Я столкнулся с следующей проблемой:

Пример:

import argparseparser = argparse.ArgumentParser()
parser.add_argument('infile')
parser.add_argument('outfile', nargs='?')
parser.add_argument('-v', action='store_true')print(parser.parse_args())

Вывод:

$ ./x.py -v in out
Namespace(infile='in', outfile='out', v=True)$ ./x.py in out -v
Namespace(infile='in', outfile='out', v=True)$ ./x.py in -v out
usage: x.py [-h] [-v] infile [outfile]
x.py: error: unrecognized arguments: out

Почему третий вызов программы не принят? Является ли это ограничением argparse?

1 ответ

Есть решение
abarnert ответил: 13 июня 2018 в 08:15

Это ограничение argparse, но частично снятое в 3.7.

Инструменты Unix обычно не претендуют на поддержку смешения опций и аргументов, даже если они часто это делают. Проблема в том, что объединение его с некоторыми другими функциями, такими как подкоманды, приводит к двусмысленности. Поэтому, как правило, библиотеки, поддерживающие любую из этих функций, используют эту проблему и не допускают смешения. Или они делают что-то вроде хакерских вариантов в конце, в начале и в некоторых трудно прогнозируемых случаях, но не в других.

Вот что argparse изначально сделал. Но 3.7 добавляет смешанный синтаксический анализ.

Вам нужно вручную вызвать parse_intermixed_args вместо parse_args.

И если вы попытаетесь использовать это с любая из функций, с которыми она не справляется, вы получите исключение (даже если нет двусмысленности для определенного набора аргументов, которые вы передаете, что должно облегчить отладку).

Но в противном случае он будет работать так, как ожидалось: опции (вместе со своими значениями, конечно) могут быть свободно смешаны с позиционными аргументами в любой точке командной строки.


К сожалению, я не знаю выпадающий backport на PyPI, чтобы получить 3,7 argparse в более ранних версиях; полуформальный argparse backport в основном предназначен для версий до 2.7 / 3.2, которые его вообще не имеют и только поддерживают версию 3.4.

Andreas Matthias ответил: 14 июня 2018 в 08:35
Я вижу, это называется смешанным разбором. Полезно знать, спасибо. Я просто устанавливаю Python 3.7, и он работает плавно.