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

174

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

Пример:

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

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

обкрадывать
источник

Ответы:

273
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)
unutbu
источник
Как это сделать со строками? У меня есть дилемма с разграничением "" (пустая строка по умолчанию) и "" (пустая строка, введенная пользователем). В коде на данный момент я использую значение по умолчанию, и, поскольку мне нужно сделать несколько операций, у меня что-то вроде этого self.foo = (args.bar or some_else_source).upper(). Не сломается ни на одном объекте AFAIUC.
0
16

На самом деле, вам нужно использовать 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

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

Адам Эриксон
источник
7

Разница между:

parser.add_argument("--debug", help="Debug", nargs='?', type=int, const=1, default=7)

и

parser.add_argument("--debug", help="Debug", nargs='?', type=int, const=1)

таким образом:

myscript.py => debug равен 7 (по умолчанию) в первом случае и «None» во втором

myscript.py --debug => отладка 1 в каждом случае

myscript.py --debug 2 => отладка 2 в каждом случае

Мюррей
источник