Python argparse: значение по умолчанию или указанное значение

Я хотел бы иметь необязательный аргумент, который по умолчанию будет иметь значение, если присутствует только флаг без указанного значения, но сохраняет значение, указанное пользователем, вместо значения по умолчанию, если пользователь указывает значение. Доступно ли для этого действие?

Пример:

python script.py --example
# args.example would equal a default value of 1
python script.py --example 2
# args.example would equal a default value of 2

Я могу создать действие, но хотел посмотреть, существует ли существующий способ сделать это.

Ответ 1

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--example', nargs='?', const=1, type=int)
args = parser.parse_args()
print(args)

% test.py 
Namespace(example=None)
% test.py --example
Namespace(example=1)
% test.py --example 2
Namespace(example=2)

  • nargs='?' означает аргументы 0 или -1
  • const=1 устанавливает значение по умолчанию, когда есть 0 аргументов
  • type=int преобразует аргумент в int

Если вы хотите, чтобы test.py установил example в 1, даже если не указано --example, включите default=1. То есть, с

parser.add_argument('--example', nargs='?', const=1, type=int, default=1)

затем

% test.py 
Namespace(example=1)

Ответ 2

На самом деле вам нужно использовать только аргумент default для add_argument, как в этом скрипте test.py:

import argparse

if __name__ == '__main__':

    parser = argparse.ArgumentParser()
    parser.add_argument('--example', default=1)
    args = parser.parse_args()
    print(args.example)

test.py --example
% 1
test.py --example 2
% 2

Подробности здесь.