Argparse append action со значением по умолчанию, только если аргумент не появляется - PullRequest
0 голосов
/ 09 января 2020

Я анализирую аргументы CLI в моей программе с библиотекой argparse. Я хотел бы проанализировать аргумент, который может повторяться, со следующим поведением:

  • , если аргумент появляется хотя бы один раз, его значения сохраняются в списке,
  • , если аргумент не отображается, значение представляет собой некоторый список по умолчанию.

Пока у меня есть следующий код:

import argparse
ap = argparse.ArgumentParser(description="Change channel colours.")
ap.add_argument('-c', '--channel', action='append', default=['avx', 'fbx'])
print(ap.parse_known_args(['-c', 'iasdf', '-c', 'fdas']))
print(ap.parse_known_args())

Это соответственно устанавливает список по умолчанию, однако это не так начните с пустого списка, когда появится аргумент. Другими словами, второй оператор print выводит правильное значение (список по умолчанию), но первый выводит

['avx', 'fbx', 'iasdf', 'fdas']

вместо

['iasdf', 'fdas']

Есть ли способ в argparse делать то, что я хочу, не делая что-то вроде

if len(args.channel) > 2:
    args.channel = args.channel[2:]

по факту?

1 Ответ

1 голос
/ 09 января 2020

Есть ошибка / проблема, обсуждающая это поведение. Я написал несколько сообщений на этот счет.

https://bugs.python.org/issue16399 argparse: действие добавления со списком по умолчанию добавляет в список вместо переопределения

На данный момент единственное изменение в документации, не в поведении.

Все значения по умолчанию помещаются в пространство имен в начале анализа. Для обычных действий пользовательские значения перезаписывают значения по умолчанию. Но в случае добавления они просто добавляются к тому, что уже есть. Он не пытается различить guish между значениями, размещенными по умолчанию, и предыдущими пользовательскими значениями.

Я думаю, что самое простое решение - оставить значение по умолчанию как есть и проверить после синтаксического анализа None или пустой список (я не помню, какой), и вставьте свой по умолчанию. Вы не получаете дополнительных очков за весь анализ в argparse. Небольшая обработка после анализа вполне нормальна.

...