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

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

Пример:

import argparse

parser = 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?

python,argparse,

3

Ответов: 1


4 принят

Это ограничение parse_intermixed_args, но это частично отменено в 3.7.

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

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

argparseВместо этого вы должны вручную позвонить argparse.

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

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


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

питон, argparse,
Похожие вопросы