Я пытаюсь проанализировать аргументы командной строки, так что возможны три возможности ниже:
script
script file1 file2 file3 …
script -p pattern
Таким образом, список файлов является необязательным. Если задана опция -p pattern
, в командной строке больше ничего не может быть. Указанный в формате "использование", вероятно, будет выглядеть следующим образом:
script [-p pattern | file [file …]]
Я думал, что способ сделать это с помощью модуля Python argparse
будет таким:
parser = argparse.ArgumentParser(prog=base)
group = parser.add_mutually_exclusive_group()
group.add_argument('-p', '--pattern', help="Operate on files that match the glob pattern")
group.add_argument('files', nargs="*", help="files to operate on")
args = parser.parse_args()
Но Python жалуется, что мой позиционный аргумент должен быть необязательным:
Traceback (most recent call last):
File "script", line 92, in <module>
group.add_argument('files', nargs="*", help="files to operate on")
…
ValueError: mutually exclusive arguments must be optional
Но в документации argparse говорится, что аргумент "*"
для nargs
означает, что он является необязательным.
Я не смог найти другое значение для nargs
, которое тоже делает трюк. Самое близкое, что я пришел, использует nargs="?"
, но это только захватывает один файл, а не необязательный список любого числа.
Можно ли написать синтаксис такого типа с помощью argparse
?