Подтвердить что ты не робот

Argparse: установка необязательного аргумента со значением обязательного аргумента

С Python argparse я хотел бы добавить необязательный аргумент, который, если не задан, получает значение другого (обязательного) аргумента.

parser.add_argument('filename',
                    metavar = 'FILE',
                    type    = str,
                    help    = 'input file'
                    )

parser.add_argument('--extra-file', '-f',
                    metavar = 'ANOTHER_FILE',
                    type    = str,
                    default = ,
                    help    = 'complementary file (default: FILE)'
                    )

Я мог бы, конечно, вручную проверить None после того, как аргументы будут проанализированы, но не существует ли более pythonic способ сделать это?

4b9b3361

Ответ 1

Насколько я знаю, нет способа сделать это более чистым, чем:

ns = parser.parse_args()
ns.extra_file = ns.extra_file if ns.extra_file else ns.filename

(точно так же, как вы предлагаете в своем вопросе).

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

Ответ 2

Это немного отличается от семантики, чем ваш исходный набор параметров, но может работать для вас:

parse.add_argument('filename', action='append', dest='filenames')
parse.add_argument('--extra-file', '-f', action='append', dest='filenames')
args = parse.parse_args()

Это заменит args.filename на список args.filenames как минимум одного файла, а -f добавит его аргумент в этот список. Поскольку возможно указать -f в командной строке перед аргументом positional, вы не можете выполнить какой-либо конкретный порядок входных файлов в args.filenames.


Другой вариант - отказаться от опции -f и сделать filename многозначным позиционным аргументом:

parse.add_argument('filenames', nargs='+')

Опять же, args.filenames будет списком хотя бы одного имени файла. Это также мешает, если у вас есть другие позиционные аргументы для вашего script.